创作目的:为了方便自己后续复习重点,以及养成写博客的习惯。
一、交换链表中的节点
1、先模拟过程
2、看carl思路和代码,然后理解。
ledcode题目:https://leetcode.cn/problems/swap-nodes-in-pairs/description/
AC代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* swapPairs(struct ListNode* head) {
if(!head || !head->next) {
return head;
}
struct ListNode* newHead = head->next;
head->next = swapPairs(newHead->next);
newHead->next = head;
return newHead;
}
二、删除链表的倒数第N个节点
1、定义fast与slow指针均指向虚拟头结点
2、fast先走n + 1步 ,这样同时移动的时候,slow才能指向删除节点的上一个节点
3、fast和slow同时移动,直到fast指向末尾,再删除slow指针的下一个节点
ledcode题目:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/
AC代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
struct ListNode* dummy = malloc(sizeof(struct ListNode));
dummy->val = 0;
dummy->next = head;
struct ListNode* fast = dummy;
struct ListNode* slow = dummy;
for(int i = 0;i < n + 1;i++) {
fast = fast->next;
}
while(fast) {
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
head = dummy->next;
free(dummy);
return head;
}
三、链表相交
1、 交点是指针相等。
2、求两个链表长度的差值,然后让较长的A移动到和较短的B末尾对齐的位置
3、比较A和cB是否相同,不相同则同时向后移动A和B,如果遇到A == B,则找到交点。
4、没找到交点则退出循环返回NULL。
ledcode题目:https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/description/
AC代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode *longL = NULL;
struct ListNode *shortL = NULL;
int lenA = 0,lenB = 0,gap = 0;
longL = headA;
while(longL) {
lenA ++;
longL = longL->next;
}
shortL = headB;
while(shortL) {
lenB ++;
shortL = shortL->next;
}
if(lenA > lenB) {
longL = headA,shortL = headB;
gap = lenA - lenB;
}else {
longL = headB,shortL = headA;
gap = lenB - lenA;
}
while(gap--) {
longL = longL->next;
}
while(shortL) { //longL
if(longL == shortL) return longL;
longL = longL->next;
shortL = shortL->next;
}
return NULL;
}
四、环形链表
1、判断链表是否有环
2、找到环的入口
3、fast先进入环中,与slow相遇也一定在环中
ledcode题目:https://leetcode.cn/problems/linked-list-cycle-ii/description/
AC代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode *detectCycle(struct ListNode *head) {
struct ListNode *fast = head;
struct ListNode *slow = head;
while(fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
if(slow == fast) {
struct ListNode *f =fast,*h =head;
while(f != h)f = f->next,h = h->next;
return h;
}
}
return NULL;
}
题外:写博客起到梳理思路,以及方便回顾和复习的作用,很多时候做题做不出来,真的很崩溃。但是仔细想想,一刷如果能照着文档和视频敲,一边敲一边理解,还不理解找时间去看视频讲解,或者群里面讨论,AC通过了也能有一定成就感。