數據結構與算法隨筆之鏈表-反轉單向鏈表(一)

​ 最近在學習數據結構和算法,目前學習到鏈表,這裏主要分析下關於鏈表涉及的面試題解決思路和實現代碼,本人熟悉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;//循環結束返回鏈表
    }
}

能夠簡單的看一下此算法的複雜度:

  • 時間複雜度:假設鏈表的長度爲n,由於要遍歷鏈表的每個節點,因此時間複雜度就是O(n)
  • 空間複雜度:O(1)
相關文章
相關標籤/搜索