美文网首页Javascript in LeetCode
leetCode (js):19. 删除链表的倒数第N个节点

leetCode (js):19. 删除链表的倒数第N个节点

作者: i7eo | 来源:发表于2018-11-15 12:37 被阅读4次

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

    示例:

    给定一个链表: 1->2->3->4->5, 和 n = 2.

    当删除了倒数第二个节点后,链表变为 1->2->3->5.

    第一种:俩次遍历,第一次遍历求得长度,第二次遍历根据长度来删除对应结点

    var removeNthFromEnd = function(head, n) {
          var len = 0,
              i = 0,
              k = 1,
              l = head,
              p = null;
          while(l) {
            len++;
            l = l.next;
          }
          l = head;
          i = len - (n - 1);
          if(len == n) i = len; //n为总长度
          while(l) {
            if(k == i && l.next) { // 节点数不为1
              p.next = l.next;
              return head;
            }else { // 节点数为1
              return null;
            }
            p = l;
            l = l.next;
            k++;
          }
        };
    

    第二种:一次遍历。利用next属性将倒数转为正数,以改题为例,l先正数n次,利用next属性通过while使r从0走过总长与n的差值即为所需删除结点的前一个节点。

    var removeNthFromEnd = function(head, n) {
            var l = head,
                r = head;
    
            while (n-- && l) {
                l = l.next;
            }
    
            //if (!l && r.next) return r.next; // 传入的链表中节点数大于1且要删除的倒数节点大小与链表节点数相等
           // if (!l && !r.next) return new ListNode('');// 传入链表节点数为1且删除1个节点
    
            if(!l) return r.next;
    
            while (l.next) {
                l = l.next;
                r = r.next;
            }
            r.next = r.next.next;
            return head;
        };
    

    总结:要删除不论正向、反向都应找到要删除结点的前一个节点。

    相关文章

      网友评论

        本文标题:leetCode (js):19. 删除链表的倒数第N个节点

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