主题谷歌实现【链表反转】,如何反转单链表?

主题示例输入:1-2-3-4-5-空输出:5-4-3-2-1-空链表结构typelistnodestruct { valintnext * listnode }第一个问题解决方案:

利用指针相互作用的想法

复杂度分析:

时间复杂度o(n ) :遍历链表以使用线性大小的时间。

空间复杂度o(1)变量pre和cur使用常数大的小额外空间。

funcreverselist(cur*listnode ) listnode ) ifcur==nil ) returnnil ) varpre*listnodeforcur!=nil {//获取下一个节点temptemp:=cur.Next//为了反转,cur.next=pre下一个节点将当前节点指定给上一个节点cur.Next=pre//上一个节点/cur.Next,pre,cur=pre,cur,cur.Next}return pre}第二个实现问题的思考:

用递归的想法实现

复杂度分析:

时间复杂度o(n ) :遍历链表以使用线性大小的时间。

空间复杂度o(n ) :遍历链表的递归深度达到NN,系统使用o(n ) o(n )较大的前切口外空间。

funcreverselistv2(head * listnode ) listnode ) ifhead==nil(returnnil ) /如果初始,则pre为nilreturnrecur ) head, nil ) }fre pre*listnode(*listnode(/当前cur为nil )表示末尾节点ifcur==nil ) returnpre ) /递归反转,因此,下一个节点, 当前节点是上一个节点RES:=recur ).cur,即cur.next cur.next=prereturnres } golang解题代码typelistnodestruct { valintnext * listng 代入testing.node )的head.val=1ln 2:=new (listnode ) ln2.val=2ln3:=new ) listnode ) ln3.val=3ln 4: ext=ln3ln3. next=ln4ln4. next=ln5///println (reverse list (head ) ) () (println ) ) ) )。=nil{fmt.printf(val:%v ),list.Val ) list=list.next } funcreverselist (cur * listnode ) listnode ) listrist=nil {//获取下一个节点temptemp:=cur.Next//为了反转,cur.next=pre下一个节点将当前节点指定给上一个节点cur.Next=pre//上一个节点cur.Next,pre,cur=pre, cur.next } return pre } funcreverselistv2(head * listnode (listnode ) ifhead==nil ) returnnil ) /如果为初始,则为pur 下一个节点(即当前节点)是当前节点,因为listnode(*listnode(/当前cur是nil )表示末尾节点ifcur==nil )返回pre ) /递归反转