源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-09-07 14:45 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Java输出链表倒数第k个节点
[b]问题描述[/b] [b]输入一个链表,输出该链表中倒数第k个结点。(尾结点是倒数第一个)[/b] 结点定义如下:
public class ListNode {
  int val;
  ListNode next = null;

  ListNode(int val) {
    this.val = val;
  }
}
[b]思路1:[/b] 先遍历链表,计算其长度length; 然后计算出倒数第k个结点就是正数第length - k + 1. 最后再遍历链表,找到所求结点 时间复杂度O(2n),需要遍历两次链表 [b]代码如下:[/b]
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){
      return null;
    }else{
      return p;
    }
  }
[b]思路2:[/b] 期待只遍历链表一次就能得到。 设置两个指针,一个初始化指向第一个结点,第二个指向第k个结点。然后两个指针同步向后移动,当第二个指向尾结点时,第一个指针即指向了倒数第k个结点 [b]代码:[/b]
public ListNode FindKthToTail(ListNode 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;
  }
[b]思路3:[/b] 将链表反转,那么原问题就变为求正数第k个结点。 然而这改变了原本的链表,且并不会比思路2更高效 链表反转:参考《[url=http://www.1sucai.cn/article/125868.htm]Java语言实现反转链表代码示例[/url]》 [b]总结[/b] 以上就是本文关于Java输出链表倒数第k个节点的全部内容,感兴趣的朋友可以继续参阅:[url=http://www.1sucai.cn/article/125859.htm]Java编程删除链表中重复的节点问题解决思路及源码分享[/url]、[url=http://www.1sucai.cn/article/125851.htm]Java编程实现从尾到头打印链表代码实例[/url]以及本站其他相关专题,如有不足之处,欢迎留言指出,小编一定及时更正,给大家更好的阅读体验和帮助,感谢朋友们对本站的支持!
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部