最近在學習數據結構和算法,目前學習到鏈表,這裏主要分析下關於鏈表涉及的面試題解決思路和實現代碼,本人熟悉java,因此實現都使用java。廢話很少說請看第一題:java
反轉單向鏈表(在leetcode上的題目地址:反轉鏈表)面試
給定一個單項鍊表:A--->B--->C--->D--->E---null,編寫一個函數反轉這個單項鍊表,輸出:E--->D---C--->B--->A--->null。算法
這個題目對思惟難度的考察不大,很容易理解,就是要把鏈表反轉過來,主要考察的是對代碼實現的能力和簡潔性比較高一點。可使用迭代的方式來實現,下面來簡單分析下,咱們須要把鏈表的每一個節點的next指針從新指向當前節點的上一個節點,算法以下:數據結構
一、定義三個節點:頭節點(head)、前驅節點(pre)和當前節點(cur)app
二、進入循環,遍歷鏈表,首先獲取當前節點的下一個節點nextNode=cur.next數據結構和算法
三、判斷next是否爲空,爲空,則head節點指向當前節點ide
四、把當前節點cur.next指向前驅pre節點,前驅節點pre指向當前節點cur,當前節點cur指向nextNode函數
五、繼續循環,直到遍歷完整個鏈表學習
這樣表述可能不是很直觀,下面用圖來形象展現這個過程this
初始化時:
不停遍歷的變化:
能夠看到最後鏈表反轉過來了。代碼實現以下:
@Data public class Node<T extends Comparable<T>> { private T item; private Node<T> next; public Node(T item) { if(item == null) { throw new RuntimeException("不能儲存null對象"); } this.item = item; } @Override public String toString() { StringBuffer result = new StringBuffer(); result.append(item.toString()).append("--->"); Node<T> p = next; while(p != null) { result.append(p.item.toString()).append("--->"); p = p.next; } result.append("null"); return result.toString(); } }
class Solution{ public static <T extends Comparable<T>> Node<T> reverseList(Node<T> list) { Node<T> pre = null; Node<T> head = null; Node<T> cur = list; while(cur != null) {//循環遍歷,沒有到鏈表結尾就不停循環 Node<T> next = cur.getNext();//先存儲下一個節點 if(next == null) {//若是next節點爲空,說明已經遍歷到最後一個節點了 head = cur;//頭節點指向最後節點,當前節點已是最後節點了 } cur.setNext(pre);//當前節點的next節點指向前驅節點 pre = cur;//更新前驅節點爲當前節點 cur = next;//更新當前節點爲下一個節點 } return head;//循環結束返回鏈表 } }
能夠簡單的看一下此算法的複雜度: