代码随想录算法训练营day4 | 24.两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07.链表相交 142.环形链表II
刷题笔记day4
24.两两交换链表中的节点
文章讲解:代码随想录
是否自己做出来通过全部用例:否
遇到的困难/犯的错误
一直想着在原链表操作,发现不管怎样都无法正确改变链表内容。
设想:如果传入**类型,直接对让cur = *head
就可以改变其内容。
但是题目只让传入*类型。
自己写的代码
看了题解后重写的代码:
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummyhead = new ListNode(0);
dummyhead->next = head;
ListNode* cur = dummyhead;
while (cur->next != NULL && cur->next->next != NULL) {
ListNode* tp = cur->next;
ListNode* temp = cur->next->next->next;
cur->next = cur->next->next;
cur->next->next = tp;
cur->next->next->next = temp;
cur = cur->next->next;
}
return dummyhead->next;
}
};
看了题解后的收获
要巧用dummyhead,创建虚拟头节点。
在原链表操作是无效的操作,并没有按期望的去改变内容。
如果要直接操作必须传入**类型再解引用操作。
19.删除链表的倒数第N个节点
文章讲解:代码随想录
是否自己做出来通过全部用例:是
遇到的困难/犯的错误
使用快慢指针,注意需要slow指向要删除的节点的前一个节点。
自己写的代码
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyhead = new ListNode(0);
dummyhead->next = head;
ListNode* fastpt = dummyhead;
ListNode* slow = dummyhead;
int counts = 0;
while (fastpt->next != nullptr) {
if (counts < n) {
++counts;
fastpt = fastpt->next;
}
else {
slow = slow->next;
fastpt = fastpt->next;
}
}
slow->next = slow->next->next;
return dummyhead->next;
}
};
看了题解后的收获
又是一道应用了快慢指针的题目。
面试题 02.07.链表相交
文章讲解:代码随想录
是否自己做出来通过全部用例:是
遇到的困难/犯的错误
两链表如果有交点,交点后的节点一定都相同,也就是长度相同,利用这一点去找交点。
自己写的代码
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* curA = headA;
ListNode* curB = headB;
int lengthA = 0;
int lengthB = 0;
int dif = 0;
while (curA != NULL) {
++lengthA;
curA = curA->next;
}
while (curB != NULL) {
++lengthB;
curB = curB->next;
}
curA = headA;
curB = headB;
dif = abs(lengthA - lengthB);
if (lengthB > lengthA) {
swap(curA, curB);
}
while (dif--) {
curA = curA->next;
}
while (curA != NULL) {
if (curA == curB) {
return curA;
}
else {
curA = curA->next;
curB = curB->next;
}
}
return NULL;
}
};
看了题解后的收获
链表交点后的节点相同,剩余长度相同。
142.环形链表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) {
break;
}
}
if (fast == NULL || fast->next == NULL) {
return NULL;
}
ListNode* index1 = fast;
ListNode* index2 = head;
while (index1 != index2) {
index1 = index1->next;
index2 = index2->next;
}
return index1;
}
};
看了题解后的收获
快指针每次走两个节点,慢指针每次走一个节点,因为快指针每次跳一格,如果有环,快慢指针一定会相遇,因此可以设置快慢指针来找是否有环。而环的位置就是快慢指针相遇的位置和头节点的位置同时开始遍历,直到找到相同的节点就是环的位置。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 jhhuangのblog!