最近在 LeetCode 上面玩 鏈表
類型的題目,因此打算寫一篇文章,分享一下在作鏈表類型題目的心得。java
衆所周知,玩鏈表就是玩指針,今天跟你們講解一個鏈表的入門題目,如何反轉一個單向鏈表 也是 LeetCode #206 是很熱門的一道編程題 LC#206 Reverse Linked List ,如圖:算法
想要反轉一個單向鏈表,除了當前的 head 指針外,咱們還另外須要兩個輔助指針:編程
無論你使用什麼編程語言,反轉鏈表的公式都是同樣的,主要分爲如下四步:ruby
使用 Java 語言表示的代碼以下:數據結構
public static ListNode reverseList(ListNode head) { ListNode next, pre = null; while (head != null) { next = head.next; head.next = pre; pre = head; head = next; } return pre; }
由於動態語言容許交叉賦值,因此使用動態語言反轉鏈表就更加的簡單,代碼以下:編程語言
def reverse_list(head) while(head != nil) cur_next, head.next, pre = head.next, pre, head head = cur_next end pre end
上面代碼和文字描述看上去可能不太直觀,咱們下面經過圖文的形式展現一個單向鏈表是如何被反轉的指針
單向鏈表的初始狀態:code
而後咱們第一步,開始初始化指針,blog
ListNode next, pre = null
而後,執行第一步切換指引的代碼:leetcode
next = head.next;
這時候鏈表和指針的位置改變以下圖:
當執行第二步代碼:
head.next = pre;
這時候鏈表內的指針發生了以下的變化:
這裏能夠看到 head 引用的 next 指向已經發生的反轉變化 ,這一步也是反轉鏈表最重要的一步
後面第三步,第四步就是移動 preNode,head 指針,準備爲下一次元素反轉作準備了
第三步代碼:
pre = head;
如圖:
這時候 preNode 已經跟 head 頭指針指向同一個節點,準備爲下一次反轉作準備
第四步代碼:
head = next;
看到這裏你們發現 nextNode 指針其實做用不大,就是幫助 head 同窗臨時佔一個位置的,反轉指針主要依靠 preNode 和 head,反轉完成後如何:
執行到這裏,元素 1 已經被反轉過來的,只須要將以上四步執行 N 次,就能夠將一個長度爲 N 的鏈表所有反轉,因此這套解法的時間複雜度就是 O(n),最後只要提交代碼,你就能戰勝全國 90%的對手,不信的話能夠打開 LeetCode 提交一下代碼 (●—●)
這道題很是簡單,若是你是老手的話就當幫你回顧一下反轉鏈表的解題思路,若是你是新手的話說不定能幫忙打開算法世界的大門,以爲文章不錯的話,能夠分享給朋友,最後再留一個問題,能夠思考一下: