Java实现输出链表倒数第k个节点的示例代码分享

这篇文章主要介绍了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){      return null;    }else{      return p;    }  }

思路2:

期待只遍历链表一次就能得到。 设置两个指针,一个初始化指向第一个结点,第二个指向第k个结点。然后两个指针同步向后移动,当第二个指向尾结点时,第一个指针即指向了倒数第k个结点

代码:

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;  }

思路3:

将链表反转,那么原问题就变为求正数第k个结点。 然而这改变了原本的链表,且并不会比思路2更高效

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

总结

以上就是Java实现输出链表倒数第k个节点的示例代码分享的详细内容,更多请关注其它相关文章!

不然你大概会一直好奇和不甘吧——家门前的那条小路,

Java实现输出链表倒数第k个节点的示例代码分享

相关文章:

你感兴趣的文章:

标签云: