为编程爱好者分享易语言教程源码的资源网
好用的代理IP,游戏必备 ____广告位招租____ 服务器99/年 ____广告位招租____ ____广告位招租____ 挂机,建站服务器
好用的代理IP,游戏必备 ____广告位招租____ 服务器低至38/年 ____广告位招租____ ____广告位招租____ 挂机,建站服务器

网站首页 > 网络编程 > 其它综合 正文

12.算法学习之删除链表的倒数第N个节点

三叶资源网 2022-12-12 19:18:50 其它综合 254 ℃ 0 评论

题目:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:给定的 n 保证是有效的。


我的思路: 首先看到这类型的题,首先肯定想到的是快慢指针, 而不是用一个额外的集合去存储链表节点,然后删除倒数第N个节点。 利用快慢指针,我们同时还得新增一个 哨兵节点,指向头结点,目的是有利于头结点的删除。我的代码如下:

public static ListNode removeNthFromEnd(ListNode head, int n) {
        //哨兵节点
        ListNode sb = new ListNode();
        sb.next = head;
        //k快指针,m慢指针
        ListNode k = sb, m = sb;
        int count = 0;
        while (k.next != null) {
            k = k.next;
            //快指针先走N步
            if (++count > n) {
                m = m.next;
            }
        }
        m.next = m.next.next;
        return sb.next;
    }


以上就是我的代码了。这类题型应该选用这类双指针的技巧。

还有的思路是利用栈Stack来做,也是可以的,不过比双指针要劣势一点。

public static ListNode removeNthFromEnd2(ListNode head, int n) {
        ListNode dummy = new ListNode(0, head);
        Stack<ListNode> stack = new Stack<>();
        ListNode cur = dummy;
        //先入栈
        while (cur != null) {
            stack.push(cur);
            cur = cur.next;
        }
        //出栈后N个节点
        for (int i = 0; i < n; i++) {
            stack.pop();
        }
        //获取到倒数第N+1个node
        ListNode node = stack.peek();
        node.next = node.next.next;
        return dummy.next;
    }


如有错误,请各位大佬指出! 谢谢。

来源:三叶资源网,欢迎分享,公众号:iisanye,(三叶资源网⑤群:21414575

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

百度站内搜索
关注微信公众号
三叶资源网⑤群:三叶资源网⑤群

网站分类
随机tag
微信Hook进程抓包软件验证API源码易语言资源网Js加密自绘滚动条TGP登录协议考勤机图片拼接动画源码GIF表情包制作腾讯滑块识别房天下js加密源码Flutter技术入门与实战登录界面源码JSEncrypt多线程ping百度旋转识别源码失败代码
最新评论