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

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

作者: miao8862 | 来源:发表于2021-04-27 21:19 被阅读0次

    给你一个链表,删除链表的倒数第 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; 
    };
    

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/beaurltx.html