24. 两两交换链表中的节点
1.题目链接:24.swap-nodes-in-pairs - 力扣(LeetCode)
2.解题关键:
3.代码示例:
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummyhead = new ListNode(0);
if (head==nullptr || head->next==nullptr)
{
return head;
}
dummyhead->next = head;
ListNode* cur = dummyhead;
while(cur->next !=nullptr && cur->next->next!=nullptr){
ListNode* pre = cur->next;
ListNode* temp = cur->next->next->next;
cur->next = cur->next->next;
cur->next->next = pre;
cur->next->next->next = temp;
cur = cur->next->next;
}
ListNode* result = dummyhead->next;
delete dummyhead;
return result;
}
};
19.删除链表的倒数第N个节点
1.题目链接:19.remove-nth-node-from-end-of-list - 力扣(LeetCode)
2.解题关键:
一次循环,利用快慢指针的思想。快指针先走n。快慢指针再同时走,直到链表结尾,即可得到慢指针到倒数第n个位置。
3.代码示例:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyhead = new ListNode(0);
dummyhead->next = head;
ListNode* fast = head;
ListNode* slow = dummyhead;
while(n-- && fast!=nullptr){
fast = fast->next;
}
while(fast!=nullptr){
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
ListNode* result = dummyhead->next;
delete dummyhead;
return result;
}
};
面试题 02.07. 链表相交
1.题目链接:
2.解题关键:
两个链表长度相减,其中长的那个先走它们差距的距离,然后再同时出发,即可同时到达相交的节点。
3.代码示例:
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* curA = headA;
ListNode* curB = headB;
int lenA = 0, lenB = 0;
while (curA != NULL) { // 求链表A的长度
lenA++;
curA = curA->next;
}
while (curB != NULL) { // 求链表B的长度
lenB++;
curB = curB->next;
}
curA = headA;
curB = headB;
// 让curA为最长链表的头,lenA为其长度
if (lenB > lenA) {
swap (lenA, lenB);
swap (curA, curB);
}
// 求长度差
int gap = lenA - lenB;
// 让curA和curB在同一起点上(末尾位置对齐)
while (gap--) {
curA = curA->next;
}
// 遍历curA 和 curB,遇到相同则直接返回
while (curA != NULL) {
if (curA == curB) {
return curA;
}
curA = curA->next;
curB = curB->next;
}
return NULL;
}
};
142.环形链表II
1.题目链接:142.linked-list-cycle - 力扣(LeetCode)
2.解题关键:
(1)如果存在环形,快指针每次走两步,慢指针每次走一步一定会在环内相遇。
(2)新的两个指针,一个从相遇的地方开始走,一个从head开始走,它们会相遇在环起点,即下面的x:
由2(x+y) = x+y+n(y+z),得到x = (n-1)(y+z)+z。
3.代码示例:
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode* fast = head;
ListNode* slow = head;
while(fast!=NULL && fast->next!=NULL){
fast = fast->next->next;
slow = slow->next;
if (fast==slow){
ListNode* temp1 = head;
ListNode* temp2 = fast;
while (temp1!=temp2){
temp1 = temp1->next;
temp2 = temp2->next;
}
return temp1;
}
}
return NULL;
}
};