赞
踩
在遍历链表时,将当前节点的
next
指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* reverseList(struct ListNode* head){ struct ListNode* p = NULL; struct ListNode* cur = head; if (!cur) { return head; } while (cur) { struct ListNode* pNext = cur->next; cur->next = p; p = cur; cur = pNext; } return p; }
若从节点
Nk+1
到Nm
已经被反转,而我们正处于Nk
,我们希望Nk+1
的下一个节点指向Nk,
所以Nk.next.next = Nk;
需要注意的是N1
的下一个节点必须指向∅
。如果忽略了这一点,链表中可能会产生环。
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* reverseList(struct ListNode* head){ if (!head || !head->next) { return head; } struct ListNode* realHead = reverseList(head->next); head->next->next = head; head->next = NULL; return realHead; }
next->next
为NULL
时,说明需要将第二个指针所指向节点移到第一个指针的后面。插入完毕后,第一个指针向后移两次(为什么是两次?因为刚才新插入了一个节点),然后循环如上,直至第一个指针的next
为空。/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ void reorderList(struct ListNode* head){ struct ListNode* pSlow = head; struct ListNode* pFast = head; if (!head->next || !head->next || !head->next->next) { return head; } while (pSlow->next && pSlow->next->next) { pFast = pSlow; while (pFast->next->next) { pFast = pFast->next; } struct ListNode* pTemp1 = pFast->next; pFast->next = pFast->next->next; struct ListNode* pTemp3 = pSlow->next; pSlow->next = pTemp1; pTemp1->next = pTemp3; pSlow = pSlow->next->next; } return head; }
方法二:线性表
方法三:寻找链表中点 + 链表逆序 + 合并链表
官方做法
这道题在看了题解后发现它主要体现了数学的思想,通过快慢指针相遇后所走的路程之间的关系列出了一个等式,慢指针继续开始走,然后推出用第三个指针从
head
开始走,当慢指针恰好也走到索引处,第三个指针也走到索引处,就可判断相遇的位置就是索要的索引节点。
/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode *detectCycle(struct ListNode *head) { struct ListNode *pSlow = head; struct ListNode *pFast = head; if (!pSlow || !pSlow->next) { return NULL; } int flag = 0; while (flag == 0 || pSlow != pFast) { if (!pFast || !pFast->next){ return NULL; } flag = 1; pFast = pFast->next->next; pSlow = pSlow->next; } struct ListNode *ptr = head; while (ptr != pSlow) { ptr = ptr->next; pSlow = pSlow->next; } return pSlow; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。