• [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}}}}
  • 相关阅读:
    wireshark无法捕获无线网卡数据解决办法(failed to set hardware filter to promiscuous mode)
    用PHP检测用户是用手机(Mobile)还是电脑(PC)访问网站
    一次.net Socket UDP编程的10万客户端测试记录
    对象复制
    c#中volatile关键字的作用
    C#操作XML
    ASP.NET AJAX
    C#操作XMl2
    SQLServer 存储过程中不拼接SQL字符串实现多条件查询
    ASP.NET刷新页面的六种方法20081111 22:04asp.net页面刷新重是有问题,收藏几种方法挺有用的.
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10575678.html
Copyright © 2020-2023  润新知