代码随想录--链表--删除链表第n个节点题型、链表相交题型
创始人
2025-05-29 06:46:49

删除链表第n个节点题型

链表遍历学清楚! | LeetCode:19.删除链表倒数第N个节点 (opens new window)

这道题我一开始想的是,倒数第n个节点,链表不方便往前找,那就从链表头结点开始找链表长度减n,这时候就是其要删除的前一个节点,然后删除操作即可。
思路应该是没有问题,不过有一点,就是链表长度,不是像数组那样直接数组.size()就能知道长度,链表需要做循环,循环完整个链表才能知道链表长度,相比下面的解法多了个循环,所以还是用下面的解法好。

利用双指针找链表中倒数第n个节点。
让快慢指针相差n个节点,然后再一起往右移,当快指针移到null时,停下来,这时候慢指针刚好指向要删除的节点处,利用慢指针操作删除操作即可。但是因为是删除,所以需要操作的是要删除节点的前一个节点,所以快慢指针应该相差n+1个节点。
这道题主要就是怎么找链表中的倒数第n个节点,并且要注意操作指针是指向倒数第n个节点的前一个节点(因为删除操作要知道前一个节点),用虚拟结点,就能统一删除操作,不用分头结点和非头节点怎么分别处理,所以我们用虚拟头结点。

大致代码套路:

new dummyhead;
fast=dummyhead;
slow=dummyhead;
n++;
while(n--&&fast!=null){
            fast=fast->next;
}
while(fast!=null){
       fast=fast->next;
       slow=slow->next;
}
slow->next=slow->next->next;
return dummyhead->next;

 

链表相交题型

我理解错了,
注意,题目是给出两个已经相交的链表,然后让你找出相交部分的初始节点。
我以为给两个链表,然后后面如果全部相同就相交,然后就输出相交的第一个节点。
我说怎么例1中8之前明明有个1,为啥不是从1开始相交呢,因为题目已经给好了呀。
哦~所以说卡哥才说,就是求两个链表交点节点的指针。 这里同学们要注意,交点不是数值相等,而是指针相等。题目是已经给好相交的了,所以如果两链表的两指针相等(指向同一个节点),则说明节点相交了。不要想太多,题目给的就是相交后,两个链表后面都是相交的了,即后面长度是一样长的了。

 那为啥要末尾位置对齐呢?
注意你要找的是两个指针指向同一个节点即相等的情况。
那如果两指针至各自末尾长度不相等的时候,你就开始一起移动,是找不到相交点的,如上图,curA从a1开始,curB从b1开始,那curB走到c1时curA已经到c2了,就错了。所以应该让长的那个链表的指针走到距离末尾长度等于短的链表指针距离末尾长度后,如下图,才开始一起移动指针并且判断是否相等。

 

注意,由于不知道两个链表那个是最长的,所以通过
if(lengthB>lengthA){
            swap(lengthA,lengthB);
            swap(curA,curB);
        }
来固定curA为最长链表的头,lengthA为最长链表的长度。
本来是curA指向headA的嘛,lengthA是表示headA所属的长度。
如果链表A的是最长的那就继续让curA为其链表的头,lengthA为其链表的长度。
如果链表B的是最长的那就交换,即交换curAB让curA指向链表B,交换lengthAB让lengthA表示链表B的长度。
 

上一篇:cuBLAS使用(3)

下一篇:VM16反虚拟化

相关内容

热门资讯

匈奴人长什么样子?境外考古还原... 匈奴人长什么样子?不清楚的读者可以和趣历史小编一起看下去。这是一个长期以来困扰中国人和欧洲人的大问题...
安徽汽车职业技术学院最新或20... 我院毕业生具有理论知识扎实、技能突出等优势,主要在江汽集团公司及安徽省大中型企事业单位就业。第四章 ...
邯郸之战秦国为什么会输呢 只因... 今天趣历史小编给大家准备了:邯郸之战的文章,感兴趣的小伙伴们快来看看吧!长平之战后,秦国已经战胜当时...
为什么秦国会被称为虎狼之师 而... 今天趣历史小编给大家准备了:秦国虎狼之师的文章,感兴趣的小伙伴们快来看看吧!说到我国历史上的战国时期...
秦国书同文车同轨 秦国之前的文... 还不知道:七国文字的读者,下面趣历史小编就为大家带来详细介绍,接着往下看吧~秦国的统一,不仅仅是地域...