反转链表是一道比较基础的算法题啦,但是确实面试高频算法题,同学前两天字节一面就被问到了这个问题,写篇博文来记录一下
首先上题目:
思路都写在注释里啦,所以直接上代码啦:
var reverseList = function(head) {
//首先声明三个变量,分别为revHead:反转后的头节点,
//temp:记录旧的next节点
//cur:记录当前遍历的节点
//初始化反转后的头节点为空,当前遍历的节点为头节点
var revHead=null,temp,cur=head;
//当当前节点不为空时
while(cur){
temp=cur.next;//首先记录下当前遍历节点的下一个节点地址
cur.next=revHead;//使得当前遍历节点的next节点指向当前节点的前一个节点,初始值为null
revHead=cur;//反转后的头节点指向当前遍历的节点
cur=temp;//当前遍历的节点向后移动
}
return revHead;
};
运行成功截图:
最后附上相应的画图解题思路,这里是参考的别人的博客,有助于理解哦
附上链接:https://www.cnblogs.com/dhls231/p/4773555.html
下面我们来用图解的方法具体介绍整个代码的实现流程:
初始状态:
第一次循环:
第一次循环过后,步骤①:pTemp指向Head,步骤②:pCur指向P1,步骤③:pTemp->pNext指向NULL。
此时得到的pRev为:
第二次循环:
第二次循环过后,步骤①:pTemp指向P1,步骤②:pCur指向P2,步骤③:pTemp->pNext指向Head。
此时得到的pRev为:
第三次循环:
第三次循环过后:步骤①:pTemp指向P2,步骤②:pCur指向P3,步骤③:pTemp->pNext指向P1。
此时得到的pRev为:
第四次循环:
第四次循环过后:步骤①:pTemp指向P3,步骤②:pCur指向NULL,步骤③:pTemp->pNext指向P2。
此时得到的pRev为:
至此,单链表的逆置完成。