给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
提示:
- 链表中结点的数目为
sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
解:如何定位倒数第 N 个结点,双指针(分别为 end 和 start ,start在前),它们之间的间隔为N,先让start先走 N 步,之后同时前进。直到start为null时,end会停在倒数第 N 个结点。通过endPre.next = end.next实现删除倒数第 N 个节点。
提问:假如图中的N = 3呢,由于没有Pre如何删除起始节点呢?
答:我们可以在一开始创建头节点来指向起始节点。
思路:画手大鹏
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode pre = new ListNode(); // 创建头节点
pre.next = head;
ListNode start = pre, end = pre;
// start先走N步
while(n != 0){
start = start.next;
n--;
}
// 定位倒数第N个节点
while(start.next != null){
start = start.next;
end = end.next;
}
// 删除节点
end.next = end.next.next;
return pre.next;
}
}