题目
就是给个链表的头节点,把链表反转过来,然后返回反转后的链表。
分析一波
之前我们去调换2个数据a和b的位置,是先定义一个新的变量c, 3者进行调换,把a的值赋值给c,再把b的值赋值给a, 最后把c的值赋值给b,这样a,b变量的值就调换了。
而链表反转也可使用这个思路:
定义3个变量分别为pre(反转后的头节点)=null,cur反转前的头节点,p反转前cur的下一个节点,也就是反转前头节点的下一个节点。
实践,上代码分析
后面最后一个节点为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,向后移动;
最后返回反转后的链表;