解题思路:
- 双指针 找到倒数第K个节点
- 记录要删除节点的前一个节点
public ListNode removeNthFromEnd (ListNode head, int n) {
// write code here
if(head ==null){
return null;
}
ListNode fast = head;
ListNode slow = head;
ListNode prev = head;
// 第一个指针先移动n步
// for(int i=0;i<n;i++){
// fast=fast.next;
// }
int i =0;
while(i<n){
if(fast ==null){
return null;
}
fast =fast.next;
i++;
}
//同时移动 ,当第一个指针走到尾部的时候,此时第2个slow指针就是倒数第n个节点位置
while(fast!=null){
fast =fast.next;
prev =slow; // 记录要删除元素的前一个节点
slow =slow.next;
// 如果写在后面,会报空指针异常
}
// 删除倒数第n个节点 即slow
ListNode temp;
if(slow!=head){ // 若不是头节点
temp = prev.next; //记录即将删除节点
// 让前一个节点的next 指向要删除节点的next
prev.next = temp.next;
}else{
temp = head;
head =head.next;
}
return head;
}