Java输出链表倒数第k个节点

网友投稿 287 2023-03-26


Java输出链表倒数第k个节点

问题描述

输入一个链表,输出该链表中倒数第k个结点。(尾结点是倒数第一个)

结点定义如下:

public class ListNode {

int val;

ListNode next = null;

ListNode(int val) {

this.val = val;

}

}

思路1:

先遍历链表,计算其长度length;

然后计算出倒数第k个结点就是正数第length - k + 1.

最后再遍历链表,找到所求结点

时间复杂度O(2n),需要遍历两次链表

代码如下:

public ListNode FindKthToTail(ListNode head,int k) {

if(head == null || k <= 0){

return null;

}

//直接遍历

ListNode p = head;

int length = 1;

while(p.next != null){

length++;

p = p.next;

}

int index = length - k + 1;

if(index <= 0){

return null;

}

p = head;

int num = 1;

while(p.next != null && num < index){

num++;

p = p.next;

}

if(num < index){

CBVyD return null;

}else{

return p;

}

}

思路2:

期待只遍历链表一次就能得到。

设置两个指针,一个初始化指向第一个结点,第二个指向第k个结点。然后两个指针同步向后移动,当第二个指向尾结点时,第一个指针即指向了倒数第k个结点

代码:

public ListNode FindKthToTail(LCBVyDistNode head,int k) {

if(head == null || k <= 0){

return null;

}

//直接遍历

ListNode p = head;

ListNode q = head;

for(int i = 0; i < k-1; i++){

if(q == null){

return null;

}

q = q.next;

}

if(q == null){

return null;

}

while(q.next != null){

p = p.next;

q = q.next;

}

return p;

}

思路3:

将链表反转,那么原问题就变为求正数第k个结点。

然而这改变了原本的链表,且并不会比思路2更高效

链表反转:参考《java语言实现反转链表代码示例》

总结

以上就是本文关于Java输出链表倒数第k个节点的全部内容,感兴趣的朋友可以继续参阅:Java编程删除链表中重复的节点问题解决思路及源码分享、Java编程实现从尾到头打印链表代码实例以及本站其他相关专题,如有不足之处,欢迎留言指出,一定及时更正,给大家更好的阅读体验和帮助,感谢朋友们对本站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:接口测试用例实例模板设计(接口测试用例设计及模板)
下一篇:api接口怎么开发(api接口搭建)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~