目录
删除链表的倒数第N个节点
描述
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
示例 1
输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]
示例 2
输入:head = [1], n = 1 输出:[]
示例 3
输入:head = [1,2], n = 1 输出:[1]
提示
- 链表中结点的数目为 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; }
}
方法:双指针
处理链表为了让头节点处理时和别的节点操作相同,我们引入一个虚拟头节点temp。即让temp.next=head。
然后我们采用快慢指针的方法,让快指针fast从虚拟头节点temp出发,先走n次,然后慢指针slow继续从temp出发,直到fast达到最后一个节点处,此时slow.next就是我们要删除的节点,最后执行slow.next=slow.next.next即可完成删除操作。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode temp=new ListNode(0);
temp.next=head;
ListNode fast=temp,slow=temp,res=temp;
for (int i = 0; i < n; i++) fast= fast.next;
while (fast.next!=null){
fast=fast.next;
slow=slow.next;
}
slow.next=slow.next.next;//删除节点
return res.next;
}
}