双指针:第一个指针先走 n 步,然后两个指针同时走。
这里要注意当链表长度<=n,要删除头节点。
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int val=0, ListNode next=null) {
* this.val = val;
* this.next = next;
* }
* }
*/
public class Solution {
public ListNode RemoveNthFromEnd(ListNode head, int n) {
// 双指针:第一个指针先走 n 步,然后两个指针同时走
if(head == null) {
return head;
}
ListNode p = head;
for(int i = 1; i <= n; i++) {
if(p == null) {
break;
}
p = p.next;
}
if(p == null) { // 不足够或刚好 n 个节点,删除头节点
return head.next;
}
// 第二步:两个指针同时走,直到走到最后
ListNode q = head, pre = null;
while(p != null) {
p = p.next;
pre = q;
q = q.next;
}
pre.next = q.next;
return head;
}
}
[LeetCode题解]19. 删除链表的倒数第N个节点 | 双指针 + 一次遍历
原文:https://www.cnblogs.com/liang24/p/14013393.html