美文网首页
算法分享第4题

算法分享第4题

作者: DevWang | 来源:发表于2017-12-19 18:52 被阅读0次
题目:给定一串链表和一个整数n,要求删除链表倒数第n个节点 (注:输入的n永远是合法的,试着访问 '一次' 链表就搞定)
如:链表 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7. 给定n=3,则删除倒数第3个节点,即值为5的节点




















思路:

  • 如果我们知道链表的长度length,那么就很好找到倒数第n个节点,也就是正数的第length - n + 1个;
  • 但是题目中没有给链表长度,我们只能换个思路,我们怎么确定哪个节点在当前链表中是倒数第n个呢,那么我们正常思维方式是先找到链表的末尾,然后依次向前数:倒数第一个,倒数第二个... 直到倒数第n个,反过来想,如果我们通过指针slow正序遍历找到某个位置的时候,恰好有个指针fast指向链表末尾(因为我们可以通过指针的nextnull来确定当前是指向了链表末尾),而且两个指针正好相差n - 1给位置,那么我们就确定了指针slow指向的正好就是倒数第n个位置的元素,为了更直观的表达,画两个图展示一下,以找到倒数第5个节点为例:
查找倒数第五个节点

代码:

// 自定义节点
class DevNode {
    public DevNode() {
    }
    // 当前节点的值
    public int value;
    // 当前节点指向的下一个节点
    public DevNode next;
}

private DevNode findNodeAt(DevNode head, int n) {
    if (head.next == null || n <= 0) {
        return null;
    }
    // 慢指针 指向头节点
    DevNode slow = head;
    // 快指针 指向头节点
    DevNode fast = head;
    // 前指针 指向慢指针指向的节点的前一个节点
    DevNode pre = head;
    // 快指针先走到第n-1个节点
    while (--n != 0 && fast.next != null) {
        fast = fast.next;
    }
    // 快慢指针一起走 快指针走向链表末尾则结束
    while (fast.next != null) {
        fast = fast.next;
        pre = slow;
        slow = slow.next;
    }
    // 如果删除的节点是头节点,直接返回头节点指向的下一个节点
    if (slow == head) {
        return head.next;
    }
    // 如果删除的是倒数第一个节点,则pre的下一个节点置为null,否则指向slow的next.
    // 目的:保持原有链表的结构
    pre.next = slow.next == null ? null : slow.next;
    return slow;
}

相关文章

  • 算法分享第4题

    题目:给定一串链表和一个整数n,要求删除链表倒数第n个节点 (注:输入的n永远是合法的,试着访问 '一次' 链表就...

  • 2021-07-16

    捡起扔掉很久的算法,先看一边算法第4版,也会刷一些lc的题。

  • 算法分享第5题

    题目:Given a string containing just the characters '(',')',...

  • 算法分享第6题

    题目:用两个栈实现一个队列,只要求实现入队,出队方法即可. 假设这两个栈分别为s1,s2 分析思路1、栈的特性为:...

  • 算法分享第3题

    题目:给定两个整数a和b,交换这两个数字,要求不引入第三个变量 如:定义a=1、b=2 交换后 a=2、b=1 思...

  • 算法分享第1题

    题目:要求定义一个方法,实现对传入的字符串进行反转并返回 如:传入字符串ABCDEFG -> 返回GFEDCBA ...

  • 算法分享第2题

    题目:斐波那契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、34、…… 现在要求...

  • 习题集锦1.0

    第1题 第2题 第3题 第4题 第5题

  • 2019字节跳动笔试

    4道算法题,2个小时。 第1题 有面额1,4,16,64四种面额的硬币,面额1024的纸币,小明拿一张面额1024...

  • 10道前端基础题

    第1题 第2题 第3题 第4题 第5题 第6题 第7题 第8题 第9题 第10题

网友评论

      本文标题:算法分享第4题

      本文链接:https://www.haomeiwen.com/subject/agvmwxtx.html