1. 题目描述
输入一个链表,输出该链表中倒数第k个结点。
2. 解体思路
方法一:简单来说就是先遍历整个链表的长度L,然后根据k,从头节点开始遍历,到L-k,得到相应的节点。
方法二:两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指针走(k-1)步,到达第k个节点。然后两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了。
3. 代码实现
方法一:
class ListNode {
int val;
ListNode next = null;
public ListNode(int val) {
this.val = val;
}
}
public class FindKthToTail {
public static void main(String[] args) {
// 定义节点
ListNode root = new ListNode(0) ;
ListNode n1 = new ListNode(3) ;
ListNode n2 = new ListNode(5) ;
ListNode n3 = new ListNode(6) ;
ListNode n4 = new ListNode(7) ;
ListNode n5 = new ListNode(9) ;
// 连接节点
root.next=n1;
n1.next=n2;
n2.next=n3;
n3.next=n4;
n4.next=n5;
ListNode tmpnode=FindToTail(root, 5);
System.out.println(tmpnode.val);
}
public static ListNode FindToTail(ListNode head, int k) {
if(head==null || k<=0) {
return null;
}
ListNode node=head;
int count=0;
while(node!=null) {
node=node.next;
count++;
}
System.out.println(count);
if (count < k)
return null;
ListNode nodetmp=head;
for(int i=0; i<count-k; i++) {
nodetmp=nodetmp.next;
}
return nodetmp;
}
}
方法二:
class ListNode {
int val;
ListNode next = null;
public ListNode(int val) {
this.val = val;
}
}
public class FindKthToTail {
public static void main(String[] args) {
// 定义节点
ListNode root = new ListNode(0) ;
ListNode n1 = new ListNode(3) ;
ListNode n2 = new ListNode(5) ;
ListNode n3 = new ListNode(6) ;
ListNode n4 = new ListNode(7) ;
ListNode n5 = new ListNode(9) ;
// 连接节点
root.next=n1;
n1.next=n2;
n2.next=n3;
n3.next=n4;
n4.next=n5;
ListNode tmpnode=FindToTail(root, 2);
System.out.println(tmpnode.val);
}
public static ListNode FindToTail(ListNode head, int k) {
if(head==null || k<=0) {
return null;
}
ListNode pre=head;
ListNode last=head;
for(int i=1; i<k; i++) {
if(pre.next!=null) {
pre=pre.next;
}else {
return null;
}
}
while(pre.next!=null) {
pre=pre.next;
last=last.next;
}
return last;
}
}
运行:
7