美文网首页Javascript in LeetCode
leetCode (js):206. 反转链表

leetCode (js):206. 反转链表

作者: i7eo | 来源:发表于2018-11-14 13:32 被阅读2次

    反转一个单链表。

    示例:

    输入: 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<i;l++){
              current.next = new ListNode(node_arr[l].val);
              current = current.next;
            }
            return reverse.next;
          };
    

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

    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. 反转链表

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