算法_反转链表(#206)

86 阅读2分钟

题目

就是给个链表的头节点,把链表反转过来,然后返回反转后的链表。

image.png

分析一波

之前我们去调换2个数据a和b的位置,是先定义一个新的变量c, 3者进行调换,把a的值赋值给c,再把b的值赋值给a, 最后把c的值赋值给b,这样a,b变量的值就调换了。
而链表反转也可使用这个思路: 定义3个变量分别为pre(反转后的头节点)=null,cur反转前的头节点,p反转前cur的下一个节点,也就是反转前头节点的下一个节点。

实践,上代码分析

image.png

image.png

后面最后一个节点为null就可以截断及节点指向。
分别定义第一第二个节点,以及哨兵节点cur.一个个向后移动。
让p.next等于cur,相当于是p后面跟的是已经反转后的链表。
如果p不为null,始终让p等于q,q=q.next,向后移动。

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var reverseList = function(head) {
    if(!head) return head;
    //分别定义第一第二个节点,以及哨兵节点cur.一个个向后移动。让p.next等于cur,,相当于是p后面跟的是已经反转后的链表。如果p不为null,始终让p等于q,q=q.next,向后移动
    let p=head,q=head.next,cur=null;
    while(p){
      p.next=cur;
      cur=p;
     (p=q) &&(q=q.next);
    }
    return cur;

};

还是先判断是否有head,没有就直接返回head退出;
然后分别定义第一第二个节点,以及哨兵节点cur,利用循环while,一个个向后移动;
让p.next等于cur,相当于是p后面跟的是已经反转后的链表;
如果p不为null,始终让p等于q,q=q.next,向后移动; 最后返回反转后的链表;