leetCode (js):206. 反转链表

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

      function ListNode(val) {
        this.val = val;
        this.next = null;
      }

    var reverseList = function(head) {
        var reverse = new ListNode(),
            current = reverse,
            node_arr = [],
            i = 0,
            l = 0;
            while(head.next || head.next === null) {
              node_arr.unshift({'val':head.val,'next':null});
              i++;
              if(head.next === null) break;
              head = head.next;
            }
        for(;l

可以说上面的代码完全是自己按照自己的想法乱来的,即没考虑时间复杂度也没考虑到与操作链表相关的算法。
改进如下:

var reverseList = function(head) {
        var p = head,
            q = null;

        while(p) {
            var tmp = p;
            p = p.next;
            tmp.next = q;
            q = tmp;
        }
        return q;
    }

复习了数据结构后采用头插法来实现。难点在于如何每次在头部插入节点,c的实现L->next = p->next ; L->next = p 而在js中无法保证每次都能获取到指向头节点的引用所以如上代码中的 tmp.next = q ; q = tmp所示动态的生成需要前插的节点。总的来说思想相同,实现不同而已。head在js中的数据结构如下:

var head = {
        'val': 1,
        'next': {
          'val': 2,
          'next': {
            'val': 3,
            'next': {
              'val': 4,
              'next': {
                'val': 5,
                'next': null
              }
            }
          }
        }
      };

你可能感兴趣的:(leetCode (js):206. 反转链表)