Skip to content

双指针 - 删除链表的倒数第N个节点

javascript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */
class ListNode {
    constructor(val, next) {
        this.val = (val === undefined ? 0 : val);
        this.next = (next === undefined ? null : next);
    }
}
function removeNthFromEnd(head, n) {
    if (!head) {
        return null;
    }
    // 获取链表长度
    let list_length = 0;
    let p1 = head;
    let p2 = head;
    while (p1) {
        p1 = p1.next ? p1.next : null;
        list_length++;
    }
    if (list_length === n) {
        return head.next;
    }
    for (let i = 0; i < list_length - n - 1; i++) {
        if (!p2) {
            break;
        }
        p2 = p2.next ? p2.next : null;
    }
    console.log('p2', p2);
    if (p2 && p2.next) {
        console.log('删除节点', p2.next);
        p2.next = p2.next.next ? p2.next.next : null;
    }
    else {
        return head.next;
    }
    return head;
}
;
const head = new ListNode(1, new ListNode(2));
// removeNthFromEnd(head, 0)
console.log(removeNthFromEnd(head, 2));
typescript
/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */
class ListNode {
    val: number
    next: ListNode | null
    constructor(val?: number, next?: ListNode | null) {
        this.val = (val === undefined ? 0 : val)
        this.next = (next === undefined ? null : next)
    }
}


function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
    if (!head) {
        return null
    }
    // 获取链表长度
    let list_length: number = 0;
    let p1: ListNode | null = head as ListNode
    let p2: ListNode | null = head as ListNode
    while (p1) {
        p1 = p1.next ? p1.next : null;
        list_length++
    }
    if(list_length === n){
        return head.next
    }
    
    for (let i = 0; i < list_length - n - 1; i++) {
        if (!p2) {
            break
        }
        p2 = p2.next ? p2.next : null
    }
    
    console.log('p2', p2)
    if (p2 && p2.next) {
        console.log('删除节点', p2.next)
        p2.next = p2.next.next ? p2.next.next : null
    } else {
        return head.next
    }
    return head
};


const head = new ListNode(1, new ListNode(2))
// removeNthFromEnd(head, 0)
console.log(removeNthFromEnd(head, 2))

源码地址