zoukankan      html  css  js  c++  java
  • [Algorithm] Reverse a linked list

    It helps to understands how recursive calls works.

    function Node(val) {
      return {
        val,
        next: null
      };
    }
    
    function LinkedList() {
      return {
        head: null,
        tail: null,
        add(val) {
          const node = new Node(val);
          if (!this.head) {
            this.head = node;
            this.tail = node;
            return node;
          }
    
          this.tail.next = node;
          this.tail = node;
          return node;
        },
        // 1 - -2 -- x-- x
        reverse() {
          const helper = node => {
            if (!node.next) {
              this.head = node;
              return;
            }
            helper(node.next);
            // after helper call ends
            // node is three
            // node.next is four
            // swap thre and four and point three next to null
            let temp = node.next;
            temp.next = node;
            node.next = null;
          };
    
          return helper(this.head);
        }
      };
    }
    
    const l = new LinkedList();
    
    l.add("one");
    l.add("two");
    l.add("three");
    l.add("four");
    l.reverse();
    console.log(l.head)
    // {"val":"four","next":{"val":"three","next":{"val":"two","next":{"val":"one","next":null}}}} 

    So for our 'helper' function, when calling it, it stop there until when reach the end. 

    one     |

    two     |

    three  |

    four    |

              v

    helper()

    four    |

    three  |

    tow     |

    one    v

    To reverse the linked list, everytime we just swap last two node, then set node.next = null.


    Here we also should the apporach to using iteration:

    function Node(val) {
      return {
        val,
        next: null
      };
    }
    
    function LinkedList() {
      return {
        head: null,
        tail: null,
        add(val) {
          const node = new Node(val);
          if (!this.head) {
            this.head = node;
            this.tail = node;
            return node;
          }
    
          this.tail.next = node;
          this.tail = node;
          return node;
        },
        reverse() {
          let current = this.head;
          let prev = null;
          while(current) {
            let next = current.next;
            current.next = prev;
             prev = current;
            current = next; 
          }
    
          this.head = prev;
        }
      };
    }
    
    const l = new LinkedList();
    
    l.add("one");
    l.add("two");
    l.add("three");
    l.add("four");
    l.reverse();
    console.log(l.head)
    // {"val":"four","next":{"val":"three","next":{"val":"two","next":{"val":"one","next":null}}}}
  • 相关阅读:
    前端-html/css
    数据结构-python
    接口测试-并发处理
    接口测试-高级运用
    接口测试-模拟网络请求
    接口测试-基础
    Jenkins-基础
    appium安装及环境搭建、入门
    Week12-unittest单元测试
    Redis在windows下安装与配置
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10575678.html
Copyright © 2011-2022 走看看