leetcode 206.反转链表

 

反转一个单链表。

 

示例:

 

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

这道题要求我们将一个链表反转,刚一看这道题目反转好像很难,但仔细分析后发现这道题的关键就是next指向问题

平时我们做的链表题目都是让它的当前节点指向它的后一个节点,这样一步一步循环,那么这道题就跟之前的正好相反,每次遍历都是让它的当前节点指向它的前一个节点,知道了这点这个题目就好做了。画个草图理解一下

 

 

 每次循环都让当前指针指向前一个节点

var reverseList = function(head) {
        //先判断为null的情况
        if (head == null || head.next == null) {
            return head;
        }

        var current  = head //当前节点
        var pre = null      //前一个节点
        while(current != null){
            var next = current.next //先保存一下当前节点的下一个节点
            current.next = pre //让当前节点指向它的前一个一个节点
            pre = current  // 前一个指针后移
            current = next //当前指针后移
            //current = current.next 错误的写法,因为这个时候current.next = pre,current = pre = null,跳出了循环
        }
        return pre
    };

这道题的关键在于当前指针指向前一个节点,还有就是每次保存当前的节点的下一个节点.

递归解法

 

var reverseList = (head, q = null) => {
    console.log(q);
    if (head) {
      return reverseList(head.next, {
        val: head.val,
        next: q,
      });
    }
    return q;
  }

 

虽然看不懂,但还是要记录一下,万一以后水平提升了说不定就能看懂了

 

posted @ 2020-02-27 22:18  leahtao  阅读(...)  评论(...编辑  收藏