相对于「链表中倒数第 k 个节点」,需要时刻维护一个前置节点,最终left
指向的节点就是需要删除的节点;
当然,也可以不用维护,通过设置哨兵的方式,使得最终left.next
就是需要删除的节点,最后让left.next = left.next.next;
即可!
时间复杂度:O(n),只需要遍历一次
空间复杂度:O(1)
Java 实现如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if(head == null || n < 0) return null;
ListNode sentry = new ListNode(0);
sentry.next = head;
ListNode left = sentry;
ListNode right = sentry;
for(int i=0;i<=n;i++){
if(right == null) return null;
right = right.next;
}
while(right != null){
left = left.next;
right = right.next;
}
left.next = left.next.next;
return sentry.next;
}
}