示例:
輸入: 1->2->3->4->5->null
輸出: 5->4->3->2->1->null
方法一:三個指標直接反轉法
思路:兩個指標用來反轉兩個節點,第三個指標用來儲存後續節點。
/**
* definition for singly-linked list.
* public class listnode
* }*/class
solution
listnode pre = null;
listnode cur = null;
listnode next = null;
cur = head;
next = cur.next;
//設定鍊錶第乙個節點為尾節點
cur.next = null;
pre = cur;
cur = next;
//使當前遍歷到的節點cur指向其前驅節點
while
(cur.next != null)
//最後乙個節點指向倒數第二個節點
cur.next = pre;
//鍊錶的頭節點指向原來鍊錶的尾節點
head = cur;
return head;
}}
演算法效能分析:
以上這種演算法只需要對鍊錶進行一次遍歷,因此,時間複雜度為o(n)。其中,n為鍊錶的長度。但是需要常數個額外個變數來儲存當前節點的前驅節點與後繼節點,因此空間複雜度為o(1),所以記憶體消耗過大。
方法二:遞迴法
思路:將乙個鍊錶看為head與head.next,先將head.next的鍊錶反轉後,再反轉這兩個節點,就是視為整體來看。例如:假設原煉表為 1->2->3->4->5,
/**
* definition for singly-linked list.
* public class listnode
* }*/class
solution
//反轉後面的節點
listnode headnext =
reverselist
(head.next)
;//把當前遍歷的節點加到後面節點逆序後鍊錶的尾部
//這句不好理解,但是將其看為兩個節點就好了,相當於反轉兩個節點
head.next.next = head;
head.next = null;
return headnext;
}}
演算法效能分析:
由於遞迴演算法只需要對鍊錶進行一次遍歷,因此,演算法的時間複雜度也為o(n)。其中n為鍊錶的長度。遞迴法的主要優點是:思路比較直觀,容易理解,而且也不需要儲存前驅節點的位址;缺點是:演算法實現的難度較大。此外,由於遞迴演算法需要不斷的除錯自己,需要額外的壓棧與彈棧操作,因此,與方法一相比效能會有所哦下降。
方法三:插入法
思路:從鍊錶的第二個節點開始,把遍歷到的節點插入到第乙個節點的前面,直到遍歷結束。假設原煉表為1->2->3->4->5,在遍歷到2時,將其插入到第乙個節點的前面,鍊錶變為2->1->null,3->4->5。切記,操作時儲存後面的節點,否則會造成丟失。
/**
* definition for singly-linked list.
* public class listnode
* }*/class
solution
listnode cur = null;
listnode next = null;
cur = head.next;
//設定鍊錶第乙個節點為尾節點
head.next = null;
//把遍歷到的節點插入到第乙個節點的前面
while
(cur != null)
return head;
}}
演算法效能分析:以上這種方法只需要對單鏈表進行一次遍歷,因此,時間複雜度為o(n)。其中,n為鍊錶的長度。與方法一相比,這種方法不需要儲存前驅節點的位址,與方法二相比,這種方法不需要遞迴的呼叫,效率更高。
引申:
對不帶頭節點的單鏈表進行逆序。
從尾到頭輸出鍊錶
方法一:就地逆序+順序輸出
首先用三個指標法對單鏈表進行逆序,然後順序輸出逆序後的鍊錶。這種方法的缺點是改變了鍊錶原來的結構。
方法二:逆序+順序輸出
申請新的儲存空間,對鍊錶進行逆序,然後順序輸出逆序後的鍊錶。逆序的主要思路為:每當遍歷到乙個節點的時候,申請一塊新的儲存空間來儲存這個節點的資料域,同時把新節點插入到新的鍊錶的頭節點後。這種方法的缺點是需要申請額外的儲存空間。
方法三:遞迴輸出
主要思路:先輸出除當前節點外的後繼子鍊錶,然後輸出當前節點。假如鍊錶為1->2->3->4->5,那麼先輸出2->3->4->5,再輸出1.同理,對於鍊錶2->3->4->5,也是先輸出3->4->5,接著輸出2,直到遍歷到鍊錶的最後乙個節點5的時候才會輸出節點5,然後遞迴地輸出6,5,…1。
/**
* definition for singly-linked list.
* public class listnode
* }*/class
solution
reverseprint
(head.next)
; system.out.
println
(head.val +
" ");}
}
單鏈表(Java版)
定義鍊錶的結點類 class node 顯示結點 public void show 定義鍊錶類及其操作方法 class linkedlist 頭刪,並返回頭結點,返回之前的頭結點 public node deleteheadnode 在任意位置插入結點,在index後面插入 public void ...
單鏈表反轉 java版
head a b c 變成 head c b a 我們可以用迴圈的方式去實現,遍歷一次鍊錶即可。1.用乙個臨時變數tmp儲存 a的下乙個元素b,a的next指向null,即 由頭變尾 head指向null。head null a b c tmp b 2.因為此時tmp就是b,所以將tmp指向tmp的...
單鏈表逆序
include include typedef struct student student typedef struct list list,list list createlist void paixu list l 比較笨拙的一種方法 list reverse list l int main ...