代码随想录第四天 24. 两两交换链表中的节点,19.删除链表的倒数第N个节点 ,142.环形链表II

文章介绍了如何在链表中两两交换节点、删除倒数第N个节点以及找到两个链表的相交节点。对于每个问题,都提供了相应的代码实现,强调了理解链表结构和使用辅助指针的重要性。此外,还涉及了寻找环形链表的入口节点的算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

24. 两两交换链表中的节点

用虚拟头结点,这样会方便很多。

本题链表操作就比较复杂了,建议大家先看视频,视频里我讲解了注意事项,为什么需要temp保存临时节点。

题目链接/文章讲解/视频讲解: https://programmercarl.com/0024.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.html

代码如下

/**

* Definition for singly-linked list.

* struct ListNode {

* int val;

* struct ListNode *next;

* };

*/

struct ListNode* swapPairs(struct ListNode* head){

struct ListNode* phead = (struct ListNode*)malloc(sizeof(struct ListNode));

phead->next = head ; //创建虚拟头节点

struct ListNode* cur = phead ;

while(cur->next !=NULL && cur->next->next != NULL){

struct ListNode* tmp = cur->next ;

struct ListNode* tmp1 = cur->next->next->next ;

cur->next = cur->next->next ;

cur->next->next = tmp ;

tmp->next = tmp1 ;

cur = cur->next->next ;

}

head = phead->next ;

struct ListNode* t = phead ;

free(t) ;

return head ;

}

感想:链表的题目先要把思路理清楚,然后画图,还有就是一些关键的节点要进行提前保存。卡哥视频讲解很清楚。

19.删除链表的倒数第N个节点

双指针的操作,要注意,删除第N个节点,那么我们当前遍历的指针一定要指向 第N个节点的前一个节点,建议先看视频。

题目链接/文章讲解/视频讲解:https://programmercarl.com/0019.%E5%88%A0%E9%99%A4%E9%93%BE%E8%A1%A8%E7%9A%84%E5%80%92%E6%95%B0%E7%AC%ACN%E4%B8%AA%E8%8A%82%E7%82%B9.html

代码如下

/**

* Definition for singly-linked list.

* struct ListNode {

* int val;

* struct ListNode *next;

* };

*/

struct ListNode* removeNthFromEnd(struct ListNode* head, int n){

struct ListNode* phead = (struct ListNode*)malloc(sizeof(struct ListNode));

phead->next = head ;

struct ListNode* fast = phead ;

struct ListNode* slow = phead ;

n++;

while(n && fast!=NULL ){

fast = fast->next ;

n-- ;

}

while(fast!=NULL){

fast = fast = fast->next ;

slow = slow->next ;

}

struct ListNode* tmp = slow->next ;

slow->next = slow->next->next ;

free(tmp);

head = phead->next;

struct ListNode* tmp1 = phead ;

free(tmp1) ;

return head ;

}

面试题 02.07. 链表相交

本题没有视频讲解,大家注意 数值相同,不代表指针相同。

题目链接/文章讲解:https://programmercarl.com/%E9%9D%A2%E8%AF%95%E9%A2%9802.07.%E9%93%BE%E8%A1%A8%E7%9B%B8%E4%BA%A4.html

代码如下

/**

* Definition for singly-linked list.

* struct ListNode {

* int val;

* struct ListNode *next;

* };

*/

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {

struct ListNode * pheada = ( struct ListNode *)malloc(sizeof(struct ListNode));

struct ListNode * pheadb = ( struct ListNode *)malloc(sizeof(struct ListNode));

pheada->next = headA ;

pheadb->next = headB ;

int lena = 0 ;

int lenb = 0 ;

struct ListNode * cura = pheada ;

struct ListNode * curb = pheadb ;

while(cura != NULL ){

cura = cura->next ;

lena++ ;

}

while(curb != NULL ){

curb = curb->next ;

lenb++ ;

}

cura = pheada ;

curb = pheadb ;

int gap;

if(lenb > lena){

gap = lenb - lena ;

while(gap){

curb = curb->next ;

gap-- ;

}

}else{

gap = lena - lenb ;

while(gap){

cura = cura->next ;

gap-- ;

}

}

while(cura != NULL){

if(cura == curb){

return cura ;

}else{

cura = cura->next ;

curb = curb->next ;

}

}

return NULL ;

}

感想:这道题难点在于理解题目,要理解找的是指针。

142.环形链表II

算是链表比较有难度的题目,需要多花点时间理解 确定环和找环入口,建议先看视频。

题目链接/文章讲解/视频讲解:https://programmercarl.com/0142.%E7%8E%AF%E5%BD%A2%E9%93%BE%E8%A1%A8II.html

代码如下

/**

* 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 != NULL && fast->next != NULL){

fast = fast->next->next ;

slow = slow->next ;

if(fast == slow){

struct ListNode * index1 = fast ;

struct ListNode * index2 = head ;

while(index1 != index2){

index1 = index1->next ;

index2 = index2->next ;

}

return index1 ;

}

}

return NULL ;

}

感想: 今天整体感觉没有昨天那么

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值