⚡每日肥学⚡——Deque简介&删除链表的倒数第 N 个结点

Posted 肥学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了⚡每日肥学⚡——Deque简介&删除链表的倒数第 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

⚽一点点思路

我相信这种题要是普通的没有这一句**你能尝试使用一趟扫描实现吗?**我觉得大家做出来都没问题。别说有问题有问题的话回到专栏自己在把以前的题再做一下,那么加上这一句我们该怎么做呢?我想要是能知道链表长度就好了做起来非常简单,但是得到链表长度不是还要遍历一次吗,然后才能得到倒数第n个。所以这里我们要发散思维了

  • 1·第一种方法:构造双指针两个指针的间隔为n当最后一个到达尾部后一个正好在倒数第n个
  • 2·第二种:如果你觉得第一种有点钻空子的话,第二种可以把链表的一个一个遍历然后放入栈里面,弹出的第n个就是要删除的。阿肥就是用这种方法做的

⚽开干

⚽介绍一种函数Deque

DequeDouble ended queue (双端队列) 的缩写,读音和 deck 一样,蛋壳。

Deque 继承自 Queue,直接实现了它的有 LinkedList, ArayDeque, ConcurrentLinkedDeque 等。

Deque 支持容量受限的双端队列,也支持大小不固定的。一般双端队列大小不确定。

Deque 接口定义了一些从头部和尾部访问元素的方法。比如分别在头部、尾部进行插入、删除、获取元素。和 Queue
Deque 的实现类主要分为两种场景:

一般场景

LinkedList 大小可变的链表双端队列,允许元素为 null

ArrayDeque 大下可变的数组双端队列,不允许 null

并发场景

LinkedBlockingDeque 如果队列为空时,获取操作将会阻塞,知道有元素添加


那么既然Deque继承了Queue接口那么它肯定能做队列吧,今天我们只说它做栈的用法,都说篇幅太长了。这里有一些它做栈的方法

⚽源码和详解

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
    //先建立一个新的节点指向头节点
        ListNode dummy = new ListNode(0, head);
        //建立栈
        Deque<ListNode> stack = new LinkedList<ListNode>();
        //这算是一个游标变量用来遍历链表的
        ListNode cur = dummy;
        //将链表的节点全部入栈
        while (cur != null) {
            stack.push(cur);
            cur = cur.next;
        }
        //出栈到第n以前
        for (int i = 0; i < n; ++i) {
            stack.pop();
        }
        下面就是将n的前一个节点链接到n的下一个
        ListNode prev = stack.peek();
        prev.next = prev.next.next;
        ListNode ans = dummy.next;
        return ans;
    }
}

好了今天的算法就到这里了,我们明天见喽 😃
推荐专栏:

📣小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶

📣python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章,可以让你快乐学python练手项目专栏

📣另外想学JavaWeb进厂的同学可以看看这个专栏:传送们

📣这是个面试和考研的算法练习我们一起加油上岸之路

以上是关于⚡每日肥学⚡——Deque简介&删除链表的倒数第 N 个结点的主要内容,如果未能解决你的问题,请参考以下文章

⚡每日算法&面试题⚡一起肥学8️⃣

⚡每日算法&面试题⚡一起肥学9️⃣

每日算法链表 & 例题选讲

⚡每日肥学⚡——算法&面试题3️⃣

⚡每日算法&面试题⚡一起肥学6️⃣

《LeetCode之每日一题》:109.删除链表的倒数第 N 个结点