/**
* Created by lxw, liwei4939@126.com on 2017/10/27.
* 删除单链表中倒数第K个结点
*/
public class TheLastKthNode {
public class Node{
public int value;
public Node next;
public Node(int data){
this.value = data;
}
}
public Node removeLastKthNode(Node head, int lastKth){
if(head == null || lastKth < 1)
return head;
Node cur = head;
while (cur != null){
lastKth--;
cur = cur.next
}
if(lastKth ==0){
head = head.next;
}
if(lastKth < 0){
cur = head;
while (++lastKth != 0){
cur = cur.next;
}
cur.next = cur.next.next;
}
return head;
}
}
ps: 假设N=9, K=6,目的是删除倒数第6 个元素,也就是正数第4个元素,需要找到目标元素的前一个元素。让链表从头开始走,每移动一步,K减1,如第三行所示,最后一个元素为-3(K-N),然后进行第二次遍历,K的值依次加1,当为0时停止遍历,此时所对应的结点即为要删除元素的前一个结点
正数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
倒数 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
5 | 4 | 3 | 2 | 1 | 0 | -1 | -2 | -3 | |
-2 | -1 | 0 |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
另外一种方法是使用双指针,front, back,front先走K个结点, 然后back与之同步走, 当front.next == null时, back所对应的结点就是要删除结点的前一个结点