当前位置: 首页 > Web前端 > JavaScript

前端出题频率最高的算法题之一!反向链表

时间:2023-03-26 22:38:30 JavaScript

完整高频题库仓库地址:https://github.com/hzfe/awesome-interview完整高频题库阅读地址:https://febook.hzfe.org/题目描述定义a函数,输入一个链表的头节点,反转链表,输出反转链表的头节点。示例:输入:1->2->3->4->5->NULL输出:5->4->3->2->1->NULL解决方法一:迭代(双指针)链接此方法在线就是遍历链表,然后在访问每个节点的时候修改下一个点,从而达到逆向链表的目的。初始化两个节点cur和pre,分别指向head和null。循环遍历链表,声明temp节点用于保存当前节点的下一个节点。修改当前节点cur的next指针指向pre节点。pre节点更改为cur节点。当前节点更改为临时节点。处理继续,直到cur节点为空,返回pre节点。/***单链表的定义。*functionListNode(val){*this.val=val;*this.next=null;*}*//***@param{ListNode}head*@return{ListNode}*/constreverseList=(head)=>{letcur=head;//正向链表头指针letpre=null;//反向链表头指针while(cur){consttemp=cur.next;//暂存当前节点的后续节点,用于更新正向链表cur.next=pre;//将当前节点指向反向链表,这是建立反向链接的过程pre=cur;//更新反向链表头指针为当前处理的节点,本轮反向链表构建完成cur=temp;//用暂存节点替换前向链表的头指针,前向链表处理完成,开始下一轮处理}returnpre;};复杂度分析时间复杂度O(N):遍历链表使用线性大小时间。空间复杂度O(1):变量pre和cur使用常量大小的额外空间。方案二:递归在线链接使用递归处理链表时,从链表的第一个节点开始,然后找到最后一个节点,也就是反向链表的头节点,然后进行回溯处理。初始链表的头节点,由head标识。如果head为空或head.next为空,则返回head。定义reverseHead节点,保存反向链表的值。每次让head的下一个节点的next指向head,形成一个反转。递归处理到最后一个节点,返回reverseHead。/***单链表的定义。*functionListNode(val){*this.val=val;*this.next=null;*}*//***@param{ListNode}head*@return{ListNode}*/constreverseList=(head)=>{//判断当前节点是否还需要处理if(head==null||head.next==null){returnhead;}//递归处理后续节点constreverseHead=reverseList(head.next);//本地反向节点head.next.next=head;head.next=null;返回反向头;};复杂度分析:时间复杂度O(N):n是链表的长度,需要对链表的每个节点进行逆向。空间复杂度O(N):n为链表的长度,空间复杂度主要取决于递归调用的栈空间,最多n层。参考资料指向报价