LeetCode19. 删除链表的倒数第 N 个结点
描述
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
示例
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
提示
- 链表中结点的数目为
sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
代码
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) {
//使用双指针 第一个指针先走n步 然后两个指针同步走 此时当第一个指针走到表尾(null)时 第二个指针指向的位置刚好是倒数第n个结点
ListNode dummy = new ListNode(-1);
dummy.next=head;
ListNode p=head,q=head,pre=dummy;
while (n>0){
p=p.next;
n--;
}
while (p!=null){
p=p.next;
pre=pre.next;
q=q.next;
}
pre.next=q.next;
return dummy.next;
}
}
总结
- 倒数的问题可以考虑双指针 使用差值实现倒数
- 链表的问题中为了规避对头结点操作而需要考虑额外处理 可以新建一个虚拟结点指向头结点