1

LeetCode 19. 删除链表的倒数第N个节点

大家好,我是灵魂画师--茄子。技术水平一般,喜欢画画。最近好忙,都没时间画画了,欠下的画我一定给大家补回来。

开始今天的正题。

19. 删除链表的倒数第N个节点

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

示例 1:

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

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

解法:
1.第一种解法

思路:
1. 先遍历一遍获取长度length。
2. 用长度length 减去 n 就是我们要到达的位置。
/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */
let removeNthFromEnd = function(head, n) {
    let length = 0;
    let dummy = new ListNode();
    dummy.next = head;
    let p = dummy;
    while(p.next != null){
        length++;
        p = p.next;
    }
    p = dummy;
    while(length - n > 0){
        length --;
        p = p.next;
    }
    p.next = p.next.next;
    return dummy.next;
}

2.快慢指针解法

思路:
1. 设定一个快指针,一个慢指针。
2. 快指针先走,慢指针暂时停留在原地。
3. 当快指针前进了n个节点的时候,慢指针也开始前进。
4. 当快指针走完全程,慢指针就是我们要的节点。
/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */
let removeNthFromEnd = function(head, n) {
    let length = 0;
    let dummy = new ListNode();
    dummy.next = head;
    let pre = cur = dummy;
    while(cur.next != null){
        if(n > 0){
            n --;
            cur = cur.next;
        } else {
            pre = pre.next;
            cur = cur.next;
        }
    }
    pre.next = pre.next.next;
    return dummy.next;
}

结合我的分析你是不是对这道题有了更清晰的认识了呢?

以上就是我的思路以及解法了,希望大家喜欢我,我会继续努力的ヾ(◍°∇°◍)ノ゙。(点个赞把我带走吧~~)


灵魂画师_茄子
11 声望4 粉丝