接着链表。
24.两两交换链表中的节点leetcode24 Swap Nodes in Pairs
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode*dummyhead=new ListNode(0);
dummyhead->next=head;
ListNode*cur=dummyhead;
while(cur->next!=nullptr&&cur->next->next!=nullptr)
{
ListNode*tmp=cur->next;
ListNode*tmp2=cur->next->next->next;
cur->next= cur->next->next;
cur->next->next=tmp;
cur->next->next->next=tmp2;
cur=cur->next->next;
}
return dummyhead->next;
}
};
这部分其实想明白了就比较简单了,但一开始比较绕建议画图。虚拟头结点真的是好帮手。
19.删除链表的倒数第N个结点 leetcode19 Remove Nth Node From End of List
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode*dummyhead=new ListNode(0);
dummyhead->next=head;
ListNode*fast=dummyhead;
ListNode*slow=dummyhead;
while(n--&&fast!=NULL)
{
fast=fast->next;
}
fast=fast->next;
while(fast!=NULL)
{
fast=fast->next;
slow=slow->next;
}
slow->next=slow->next->next;
return dummyhead->next;
}
};
这个题目利用了快慢指针,因为是倒数第n个所以快指针先跑n+1,然后再和slow一起动,从而使得slow的下一个就是要删除的第N个结点。
面试题 02.07. 链表相交 Intersection of Two Linked Lists LCCI
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode*curA=headA;
ListNode*curB=headB;
int lenA=0,lenB=0;
while(curA!=NULL)
{
lenA++;
curA=curA->next;
}
while(curB!=NULL)
{
lenB++;
curB=curB->next;
}
curA=headA;
curB=headB;
if(lenB>lenA)
{
swap(lenA,lenB);
swap(curA,curB);
}
int gap=lenA-lenB;
while(gap--)
{
curA=curA->next;
}
while(curA!=NULL)
{
if(curA==curB)
{
return curA;
}
curA=curA->next;
curB=curB->next;
}
return NULL;
}
};
Tips:在这里需要注意的是先计算长度,然后将其在同一起跑线开始比较。
142.环形链表 leetcode 142 Linked List Cycle II
环形链表看代码随想录讲了一大堆东西要理解的,但这里我觉得只记住几点就能做出这个题,第一个是快慢指针,快指针跑两下,慢指针跑一下如能相遇则证明有环,第二环的入口,由两个指针一个从头一个从相遇点同时出发,相遇就是环的入口。
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode*fast=head;
ListNode*slow=head;
while(fast!=NULL&&fast->next!=NULL)
{
slow=slow->next;
fast=fast->next->next;
if(slow==fast)
{
ListNode*index1=head;
ListNode*index2=fast;
while(index1!=index2)
{
index1=index1->next;
index2=index2->next;
}
return index2;
}
}return NULL;
}
};