博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
寻找链表倒数第K个节点 (NC69)/ 删除链表倒数第N个节点(NC53)
阅读量:4128 次
发布时间:2019-05-25

本文共 1504 字,大约阅读时间需要 5 分钟。

寻找链表倒数第K个节点

单向链表只有从前往后的指针而没有从后往前的指针。

第一种方法是先循环一遍链表确定结点个数n,则倒数第k个结点就是就是正数的第n+1-k个,然后在遍历一次链表就可以找到指定结点了,但显然需要遍历两遍链表。

第二种方法可以使用两个指针,第一个指针先走 k-1 步,然后第二个指针开始走。当第一个指针移动到最后时,第二个指针正好指向倒数第k个结点,只需要遍历一遍链表,显然更高效。要注意循环的条件,因为第一步就进行了next操作,所以应该是  --k。

代码

//给定一个链表: 1->2->3->4->5, 和 k = 2.//返回链表 4->5.var getKthFromEnd = function (head, k) {    //用两个指针来跑,两个指针中间相距k-1个节点,第一个指针先跑,跑到了第k个节点时,第二个指针则是第一个节点。    //这时候两个一起跑。当第一个跑到了最后一个节点时,这时候第一个指针则是倒数第k个节点。    if (head === null || k <= 0)         return null;    let pNode1 = head, pNode2 = head;    while (--k) {  // fast 先走 k-1 步,n--走n步,--n走n-1步(这里先走1步)        if (pNode2.next !== null) {            pNode2 = pNode2.next;        } else {            return null;        }    }    while (pNode2.next !== null) {        pNode1 = pNode1.next;        pNode2 = pNode2.next;    }    return pNode1;};

while(--k)与while(k--)区别

  • --k就是先让k减去1,再把k-1的结果给--k
  • k--是先把k的结果给k--,然后k自己减1

 

删除链表倒数第N个节点

第一个指针从列表的开头向前移动 n 步,而第二个指针将从列表的开头出发。现在,这两个指针被 n 个结点分开。我们通过同时移动两个指针向前来保持这个恒定的间隔,直到第一个指针到达最后一个结点。此时第二个指针将指向从最后一个结点数起的第 n 个结点。我们重新链接第二个指针所引用的结点的 next 指针指向该结点的下下个结点。

//给定一个链表: 1->2->3->4->5, 和 n = 2.//当删除了倒数第二个节点后,链表变为 1->2->3->5. var removeNthFromEnd = function(head, n) {    let fast = head, slow = head;    while(n--) {  // fast 先走 n 步,n--走n步,--n走n-1步(这里先走2步)          fast = fast.next;    }    if(fast == null)         return head.next;    while(fast.next) {  // fast、slow 一起前进        fast = fast.next;        slow = slow.next;    }    slow.next = slow.next.next; // 删除slow.next那个节点    return head;};

 

转载地址:http://nnuvi.baihongyu.com/

你可能感兴趣的文章
`MQTTClient (~> 0.2.6)` required by `Podfile`
查看>>
X-Code 报错 ld: library not found for -lAFNetworking
查看>>
Bitcode
查看>>
If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
查看>>
3.5 YOLO9000: Better,Faster,Stronger(YOLO9000:更好,更快,更强)
查看>>
iOS菜鸟学习--如何避免两个按钮同时响应
查看>>
How to access the keys in dictionary in object-c
查看>>
iOS菜鸟学习—— NSSortDescriptor的使用
查看>>
hdu 3787 hdoj 3787
查看>>
hdu 3790 hdoj 3790
查看>>
hdu 3789 hdoj 3789
查看>>
hdu 3788 hdoj 3788
查看>>
zju 1003 zoj 1003
查看>>
zju 1004 zoj 1004
查看>>
zju 1005 zoj 1005
查看>>
zju 1006 zoj 1006
查看>>
【虚拟机】虚拟化架构与系统部署(Windows系统安装)
查看>>
字节跳动安卓开发实习生面试分享
查看>>
好书分享之——《能力陷进》
查看>>
阅读笔记《c++ primer》
查看>>