做文明人网站专题,对网站提出的优化建议,住房和城乡建设厅官网证件查询,连云港网站建设哪家好删除链表第n个节点题型 链表遍历学清楚#xff01; | LeetCode#xff1a;19.删除链表倒数第N个节点 (opens new window)
这道题我一开始想的是#xff0c;倒数第n个节点#xff0c;链表不方便往前找#xff0c;那就从链表头结点开始找链表长度减n#xff0c;这时候就是…删除链表第n个节点题型 链表遍历学清楚 | LeetCode19.删除链表倒数第N个节点 (opens new window)
这道题我一开始想的是倒数第n个节点链表不方便往前找那就从链表头结点开始找链表长度减n这时候就是其要删除的前一个节点然后删除操作即可。 思路应该是没有问题不过有一点就是链表长度不是像数组那样直接数组.size()就能知道长度链表需要做循环循环完整个链表才能知道链表长度相比下面的解法多了个循环所以还是用下面的解法好。 利用双指针找链表中倒数第n个节点。 让快慢指针相差n个节点然后再一起往右移当快指针移到null时停下来这时候慢指针刚好指向要删除的节点处利用慢指针操作删除操作即可。但是因为是删除所以需要操作的是要删除节点的前一个节点所以快慢指针应该相差n1个节点。 这道题主要就是怎么找链表中的倒数第n个节点并且要注意操作指针是指向倒数第n个节点的前一个节点(因为删除操作要知道前一个节点)用虚拟结点就能统一删除操作不用分头结点和非头节点怎么分别处理所以我们用虚拟头结点。
大致代码套路
new dummyhead; fastdummyhead; slowdummyhead; n; while(n--fast!null){ fastfast-next; } while(fast!null){ fastfast-next; slowslow-next; } slow-nextslow-next-next; return dummyhead-next; 链表相交题型
我理解错了 注意题目是给出两个已经相交的链表然后让你找出相交部分的初始节点。 我以为给两个链表然后后面如果全部相同就相交然后就输出相交的第一个节点。 我说怎么例1中8之前明明有个1为啥不是从1开始相交呢因为题目已经给好了呀。 哦所以说卡哥才说就是求两个链表交点节点的指针。 这里同学们要注意交点不是数值相等而是指针相等。题目是已经给好相交的了所以如果两链表的两指针相等(指向同一个节点)则说明节点相交了。不要想太多题目给的就是相交后两个链表后面都是相交的了即后面长度是一样长的了。 那为啥要末尾位置对齐呢 注意你要找的是两个指针指向同一个节点即相等的情况。 那如果两指针至各自末尾长度不相等的时候你就开始一起移动是找不到相交点的如上图curA从a1开始curB从b1开始那curB走到c1时curA已经到c2了就错了。所以应该让长的那个链表的指针走到距离末尾长度等于短的链表指针距离末尾长度后如下图才开始一起移动指针并且判断是否相等。 注意由于不知道两个链表那个是最长的所以通过 if(lengthBlengthA){ swap(lengthA,lengthB); swap(curA,curB); } 来固定curA为最长链表的头lengthA为最长链表的长度。 本来是curA指向headA的嘛lengthA是表示headA所属的长度。 如果链表A的是最长的那就继续让curA为其链表的头lengthA为其链表的长度。 如果链表B的是最长的那就交换即交换curAB让curA指向链表B交换lengthAB让lengthA表示链表B的长度。