链表中倒数第k个结点
题目描述
输入一个链表,输出该链表中倒数第k个结点。
方法一
假设所给链表的长度为n,那么倒数第k和节点就是从头结点开始第n-k+1个节点,所以需要遍历两次链表,第一次遍历得出链表的长度,第二次表理你获得第n-k+1个节点
public ListNode FindKthToTail(ListNode head,int k) {
if(head == null || k <= 0) {
return null;
}
int len = 0;
ListNode node = head;
while(node != null) {
++len;
node = node.next;
}
if(len < k) return null;
for (int j = 0; j <= len - k && head !=null; j++) {
if(j == (len - k)) {
break;
}
head = head.next;
}
return head;
}
方法二
设置两个指针且初始化都指向头结点,然后再让第一个指针走(k-1)步,到达第k个节点。然后两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点。
相当于制造了一个K长度的尺子,把尺子从头往后移动,当尺子的右端与链表的末尾对齐的时候,尺子左端所在的结点就是倒数第k个结点
public ListNode FindKthToTail_2(ListNode head,int k) {
if(head == null || k <= 0) {
return null;
}
ListNode node1 = head, node2 = head;
for (int i = 0; i < (k - 1); i++) {
if(node1.next != null) {
node1 = node1.next;
}
else return null;
}
while(node1.next != null) {
node1 = node1.next;
node2 = node2.next;
}
return node2;
}