日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

看一遍就理解,图解单链表反转

發布時間:2025/3/20 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 看一遍就理解,图解单链表反转 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

反轉鏈表是程序員必備的基本素養,經常在面試、筆試的過程中出現。一直覺得反轉鏈表實現代碼不是很好理解,決定搬leetcode那道經典反轉鏈表題出來,用十多張圖去解析它,希望加深大家對鏈表反轉的理解,謝謝閱讀。

leetcode的反轉鏈表原題&答案

題目描述: 反轉一個單鏈表。

輸入: 1->2->3->4->5->NULL 輸出: 5->4->3->2->1->NULL

分析:

假設存在鏈表 1 → 2 → 3 → ?,我們想要把它改成 ? ← 1 ← 2 ← 3。

在遍歷列表時,將當前節點的 next 指針改為指向前一個元素。由于節點沒有引用其上一個節點,因此必須事先存儲其前一個元素。在更改引用之前,還需要另一個指針來存儲下一個節點。不要忘記在最后返回新的頭引用!

代碼實現:

public ListNode reverseList(ListNode head) { ListNode prev = null; ListNode curr = head; while (curr != null) { ListNode nextTemp = curr.next;curr.next = prev;prev = curr;curr = nextTemp;}return prev; }

圖解鏈表反轉代碼的實現

接下來,我們圖解以上代碼實現,先對以上實現代碼加上行號,如下:

public ListNode reverseList(ListNode head) { //1ListNode prev = null; // 2ListNode curr = head; // 3while (curr != null) { //4ListNode nextTemp = curr.next; //5curr.next = prev; // 6prev = curr; //7curr = nextTemp; //8} return prev; //9 }

第一行代碼圖解

public ListNode reverseList(ListNode head) { //1

我們順著題目描述意思,假設鏈表就有1、2、3個元素吧,后面還跟著一個null,又因為輸入是ListNode head,所以這個即將要反轉的鏈表如下:

第二行代碼圖解

ListNode prev = null; // 2

將null賦值給prev,即prev指向null,可得圖如下:

第三行代碼圖解

ListNode curr = head;

將鏈表head賦值給curr,即curr指向head鏈表,可得圖如下:

循環部分代碼圖解

while (curr != null) { //4ListNode nextTemp = curr.next; //5curr.next = prev; // 6prev = curr; //7curr = nextTemp; //8}

循環部分是鏈表反轉的核心部分,我們先走一遍循環,圖解分析一波。

因為curr指向了headhead不為null,所以進入循環。先來看第5行:

ListNode nextTemp = curr.next; //5

把curr.next 賦值給nextTemp變量,即nextTemp 指向curr的下一節點(即節點2),可得圖如下:

再執行到第6行:

curr.next = prev; // 6

把prev賦值給curr.next,因為prev初始化化指向null,即curr(節點1)指向了null,鏈表圖解成這樣了:

然后我們看執行到第7行

prev = curr; //7

把curr賦值給prev,prev指向curr,圖解如下:

接著,我們執行到第8行:

curr = nextTemp; //8

把nextTemp賦值給curr,即curr指向nextTemp,圖解如下:

至此,第一遍循環執行結束啦,回到循環條件,curr依舊不為null,我們繼續圖解完它。

5-8行代碼又執行一遍,依次可得圖:

ListNode nextTemp = curr.next; //5curr.next = prev; // 6prev = curr; //7curr = nextTemp; //8

執行完 ListNodenextTemp=curr.next;后:

執行完 curr.next=prev;后:

執行完 prev=curr;后:

執行完 curr=nextTemp;后:

來到這里,發現curr還是不為null,再回到while循環,再執行一遍:

ListNode nextTemp = curr.next; //5curr.next = prev; // 6prev = curr; //7curr = nextTemp; //8

依次可得圖:

來到這里,我們發現curr已經為null了,可以跳出循環了。這時候prev指向的就是鏈表的反轉呀,所以第9行執行完,反轉鏈表功能實現:

return prev; //9

參考與感謝

  • LeetCode 官網

總結

以上是生活随笔為你收集整理的看一遍就理解,图解单链表反转的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。