链表中环的入口节点

解题思路 :
记住x = z就行,因此slow和fast相遇时,分别从头结点和相遇节点启动一个步伐一致(1)的指针,其相遇的结点就是入口!
cpp
class Solution {
public:
ListNode* EntryNodeOfLoop(ListNode* pHead) {
if(pHead == nullptr) return pHead;
ListNode* slow = pHead;
ListNode* fast = pHead;
while(fast != nullptr && fast->next != nullptr){
slow = slow->next;
fast = fast->next->next;
if(slow == fast){
ListNode* a = pHead;
ListNode* b = slow;
while(a != b){
a = a->next;
b = b->next;
}
return a;
}
}
return nullptr;
}
};
删除链表的倒数第n个节点

思路:【双指针】
step1:给链表添加表头preHead,处理删除掉第一个元素时比较方便;
step2:快指针fast,先在链表上走n步 !
step3:慢指针slow(指向原始链表头head),代表当前元素;前序节点pre指向添加的表头preHead(删除链表节点时需要pre )
step4:slow/fast同步移动,当fast到达链表尾部(NULL),slow正好到了倒数第n个元素位置;
step5:最后将该节点的前序节点pre指针指向该节点next的节点(删掉这个节点);
cpp
ListNode* removeNthFromEnd(ListNode* head, int n) {
// write code here
ListNode* preHead = new ListNode(-1);
preHead->next = head;
//当前节点
ListNode* slow = head;
//前序节点
ListNode* pre = preHead;
ListNode* fast = head;
while(n--){
if(fast == nullptr){
return nullptr;
}
fast = fast->next;
}
while(fast != nullptr){
fast = fast->next;
pre = pre->next;
slow = slow->next;
}
pre->next = slow->next;
return preHead->next;
}