算法练习13:删除链表的倒数第 n 个结点(leetcode 1

2021-04-27  本文已影响0人  miao8862

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

解题思路:

  1. 设置两个指针p1, p2,p1指向头节点,p2比p1多走n步
  2. 当p2为空时,代表头节点为倒数第n个节点,删除头节点就好;
  3. 如果p2不为空,那么p1和p2同时向右移,直到p2是最后一个节点,此时p1为要删除的节点的上一个节点,直接将p1链接到下下个节点,即为删除此数
  4. 返回头节点

这道题不难,但找到边界值是关键

var removeNthFromEnd = function(head, n) {
  // 当链表为空时,返回null
  if(!head) {
      return null;
  }
 // 当链表节点小于1时,且删除节点为1个时,返回空链表
  if(!head.next && n === 1) {
      return null;
  }
  // p2快n步指针,p1正常指针
  let p1 = head;
  let p2 = head;
  // p2指针快走n步
  while(n > 0) {
    if(p2) {
      p2 = p2.next;
      n--;
    }else {
      throw new Error(`不存在这个倒数`)
    }
  }
  // 如果此时p2已经是空的,说明头指针刚好是倒数的这个数
  if(!p2) {
    head = head.next
    return head;
  }
  // p1和p2同时向后移,直到p2走到最后一个节点,p1所在的节点就为要删除的数的上一个节点
  while(p2.next) {
      p2 = p2.next
      p1 = p1.next
  }
  // 删除这个倒数
  p1.next = p1.next.next
  // 返回链表头指针
  return head; 
};
上一篇下一篇

猜你喜欢

热点阅读