JS算法之删除链表的倒数第N个结点

222 阅读2分钟

这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战

删除链表的倒数第N个结点

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

难度:中等

题目:leetcode-cn.com/problems/re…

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

示例1:

 输入:head = [1,2,3,4,5], n = 2
 输出:[1,2,3,5]

示例2:

 输入:head = [1], n = 1
 输出:[]

示例3:

 输入:head = [1,2], n = 1
 输出:[1]

示例4:

 输入:head = [1,3,4], n = 2
 输出:[1,4]

提示:

  • 链表中结点的数目为 sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

进阶: 你能尝试使用一趟扫描实现吗?

题解

法一 暴力解法

获取到链表的长度,并删除从链表开头数起的第(L-n+1)个节点即可。

 /**
  * Definition for singly-linked list.
  * function ListNode(val, next) {
  *     this.val = (val===undefined ? 0 : val)
  *     this.next = (next===undefined ? null : next)
  * }
  */
 /**
  * @param {ListNode} head
  * @param {number} n
  * @return {ListNode}
  */
 var removeNthFromEnd = function(head, n) {
   const dummy = new ListNode(0,head);
   const len = getLength(head);
   let cur = dummy;
   for(let i = 1; i < length - n + 1; i++){
     cur = cur.next;
   }
   cur.next = cur.next.next;
   const res = dummy.next;
   return res;
 };
 ​
 function getLength(head) {
     let length = 0;
     while(head){
       length++;
       head = head.next;
     }
     return length;
   }

时间复杂度:O(n)

空间复杂度:O(1)

法二 快慢指针

需要找到倒数第n个节点,可以使用两个指针firstsecond(初始时均指向头节点)同时对链表进行遍历,并且firstsecond超前n个节点。当first遍历到链表的末尾(遍历到NULL)时,second的下一个节点就恰好处于倒数第n个节点。

 ​
 /**
  * Definition for singly-linked list.
  * function ListNode(val, next) {
  *     this.val = (val===undefined ? 0 : val)
  *     this.next = (next===undefined ? null : next)
  * }
  */
 /**
  * @param {ListNode} head
  * @param {number} n
  * @return {ListNode}
  */
 var removeNthFromEnd = function(head, n) {
   const dummy = new ListNode(0, head);
   let first = dummy;
   let second = dummy;
   for(let i = 0; i < n; i++){
     first = first.next;
   }
   while(first.next){
     first = first.next;
     second = second.next;
   }
   second.next = second.next.next;
   return dummy.next;
 };

时间复杂度:O(n)

空间复杂度:O(1)


坚持每日一练!前端小萌新一枚,希望能点个+在看哇~