两两交换链表中的节点
易错点在于
- 需要考虑当前节点 p,待反转的节点 a,与 b,这两个界点位于p的后方。
- a,b反转,需要考虑的是将 a, b ,p 三个节点的next指向对应位置
// An highlighted block
ListNode* swapPairs(ListNode* head) {
ListNode * dummy = new ListNode(-1);
dummy->next = head;
for(ListNode* p =head ; p && p->next && p->next->next;)
{
auto a = p->next;
auto b= p->next->next;
p->next =b;
a->next =b->next;
b->next =a;
p=a;
}
return dummy->next;
}
删除链表的倒数第 N 个结点
需要注意的点是
为了方便我们让快指针先走n步,但如果只是这样的化最终只能删除倒数第n+1个,所以从dummy节点开始走
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *dummy = new ListNode(-1);
dummy->next = head;
ListNode * slow = dummy;
ListNode * fast = dummy;
while(n--) fast=fast->next;
while(fast->next)
{
fast =fast->next;
slow =slow->next;
}
slow ->next =slow->next->next;
return dummy->next;
}
链表相交
有思路即可
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(headA ==nullptr || headB ==nullptr) return nullptr;
ListNode *la=headA;
ListNode *lb=headB;
while(la!=lb)
{
la = la == nullptr ? headB:la->next;
lb = lb == nullptr ? headA:lb->next;
}
return la;
}
}
环形链表入口
```cpp
ListNode *detectCycle(ListNode *head) {
ListNode* slow = head;
ListNode* fast = head;
while(fast && fast->next)
{
fast = fast->next->next;
slow = slow->next;
if( slow == fast) break;
}
if(fast == nullptr || fast->next==nullptr)
{
return nullptr;
}
slow = head;
while(slow!=fast)
{
slow=slow->next;
fast=fast->next;
}
return slow;
}