29.删除链表的倒数第N个结点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例1:
image

输入: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;
    }
}
posted @ 2025-04-23 09:42  回忆、少年  阅读(19)  评论(0)    收藏  举报