單鏈表的逆序 Java版

2021-09-12 20:15:44 字數 3048 閱讀 7533

示例:

輸入: 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 ...