算法分享第4题

2017-12-19  本文已影响0人  DevWang
题目:给定一串链表和一个整数n,要求删除链表倒数第n个节点 (注:输入的n永远是合法的,试着访问 '一次' 链表就搞定)
如:链表 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7. 给定n=3,则删除倒数第3个节点,即值为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;
}
上一篇 下一篇

猜你喜欢

热点阅读