29.删除链表的倒数第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
代码:
1.使用栈
/**
* 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) {
//定义一个头节点,它的next指针指向head
ListNode l = new ListNode(0,head);
//定义一个双端队列
Deque<ListNode>stack = new LinkedList<>();
//定义一个节点指向l
ListNode cur = l;
//遍历链表,将所有节点都存入双端队列
while(cur!=null){
stack.push(cur);
cur = cur.next;
}
//由于需要删除链表的倒数第n个节点,故弹出后n个节点,找到需要删除节点的前一个节点
for(int i = 0;i<n;i++)stack.pop();
//prev即为需要删除节点的前一个节点
ListNode prev = stack.peek();
//将该节点指向prev.next.next以跳过需要删除的节点
prev.next = prev.next.next;
//返回头节点
return l.next;
}
}
2.使用快慢指针
/**
* 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 l = new ListNode(0,head);
//定义快指针指向head,定义慢指针指向l
ListNode first = head,second = l;
//快指针先往后移动n个节点
for(int i=0;i<n;i++)first = first.next;
//快慢指针同时移动,直到快指针为null,此时慢指针指向的就是需要删除节点的前一个节点
while(first!=null){
first = first.next;
second = second.next;
}
//将second指向second.next.next以跳过倒数第n个节点
second.next = second.next.next;
//返回头节点
return l.next;
}
}

浙公网安备 33010602011771号