思路:分为零个结点、一个结点、两个结点和三个及以上个结点四种情况来解决。
自己写的 C 代码,比较麻烦:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head) {
// 空的或者一个结点
if (head == NULL || head->next == NULL) {
return head;
}
struct ListNode* prior = head;
struct ListNode* current = head->next;
struct ListNode* pnext = head->next->next;
if (pnext == NULL) { // 两个结点
prior->next = NULL;
current->next = prior;
return current;
} else { // 三个或更多结点
prior->next = NULL;
while (pnext != NULL) {
current->next = prior;
prior = current;
current = pnext;
pnext = pnext->next;
}
current->next = prior;
return current;
}
}
官方题解:
思路:在遍历链表时,将当前节点的 next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。
C 代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode* prior = NULL;
struct ListNode* current = head;
while (current) {
struct ListNode* pnext = current->next;
current->next = prior;
prior = current;
current = pnext;
}
return prior;
}
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » 206. 反转链表
发表评论 取消回复