16.刪除鏈表中的倒數第N個節點

題目描述:

給定一個鏈表,刪除鏈表的倒數第 n 個節點,並且返回鏈表的頭結點。
示例:

給定一個鏈表: 1->2->3->4->5, 和 n = 2.
當刪除了倒數第二個節點後,鏈表變爲 1->2->3->5.

代碼實現:

  • 常規方法,第一次遍歷找到鏈表的長度,第二次刪除對應節點。
/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */
var removeNthFromEnd = function(head, n) {
    var preHead = new ListNode(null)
    preHead.next = head
    var len = 0
    var first = head
    while (first) {
        len++
        first = first.next
    }
    len -= n
    first = preHead
    while (len != 0) {
        len--
        first = first.next
    }
    first.next = first.next.next
    return preHead.next
};

在這裏插入圖片描述

  • 雙指針法,很精妙的解法,快指針先跑n,之後快慢一起跑,快指針跑到最後時慢指針對應的就是刪除的節點。
/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */
var removeNthFromEnd = function(head, n) {
    var preHead = new ListNode(null)
    preHead.next = head
    var fast = preHead
    var slow = preHead
    while (n != 0) {
        fast = fast.next
        n--
    }
    while (fast.next != null) {
        fast = fast.next
        slow = slow.next
    }
    slow.next = slow.next.next
    return preHead.next
};

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章