Javascript in LeetCode

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

2018-11-15  本文已影响4人  i7eo

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

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

上一篇下一篇

猜你喜欢

热点阅读