思路 1 :两个指针 p1 ,p2 ,p1从头开始遍历,当 p1 到达第 k 个节点时,p2 开始; 当 P1 到达链表的最后一个节点时,p2 所指的节点则为链表中倒数第 k 个节点。
public class Node{
public int data;
public Node next;
public Node(int data){
this.data = data;
}
public Node removeLastKNode(Node head,int k){
if(head == null || k < 1){
return head;
}
Node p1 = head;
Node p2 = head;
int num = 1;
while(p1.next != null && num < k){
++num;
p1 = p1.next;
}
while(p1.next != null){
p1 = p1.next;
p2 = p2.next;
}
p2.next = p2.next.next;
return head;
}
}
思路 2:时间复杂度 O(n) ,空间复杂度 O(1)。
1>若链表为空或 K < 1,直接返回;
2>链表从头走到尾,每移动一步,k 值减 1 ;
3>若 k > 0,则没有倒数第 k 个节点,返整个链表;
若 k = 0,则头结点为倒数第 k 个节点,返回头指针;
若 k < 0 ,从头遍历寻找要删除节点的前一个节点,每移动一步就让 k 值加 1 ,当 k=0 时,指针值向的节点则为要删除节点的前一个节点。
public Node removeLastKNode(Node head,int k){
if(head == null || k < 1){
return head;
}
Node p = head;
while(p != null){
k--;
p = p.next;
}
if(k == 0){
head = head.next;
}
if(k < 0){
p = head;
while(++k != 0){
p = p.next;
}
p.next = p.next.next;
}
return head;
}
来源:https://www.cnblogs.com/janenan/p/5672925.html