1. 程式人生 > 其它 >連結串列反轉

連結串列反轉

劍指 Offer 06. 從尾到頭列印連結串列

上面這道題本身不難,利用棧就可以了。

但是上次小米麵試的時候,面試官讓我反轉一個連結串列,覺得比這道Offer稍微難一丟丟。賦值順序、返回的新頭節點還是需要思考一下的。

直接用的Offer 06 的資料結構。

【不得不感嘆,部落格園的程式碼插入是真難用,複製貼上格式都要變】

class Solution {
    public static void main(String[] args) {
        Solution o = new Solution();
        int[] arr = {1,2,3,4};
        ListNode head1 
= o.create(arr); System.out.println("連結串列:"); o.print(head1); System.out.println(); ListNode head2 = o.reverse(head1); System.out.println("連結串列反轉後:"); o.print(head2); } //連結串列反轉 public ListNode reverse(ListNode head) { ListNode prev
= null; ListNode curr = head; ListNode next = head; while(next != null){ next = curr.next; //這個必須放前面,如果放後面,curr.next就已經被更改為prev了,就丟掉了。 curr.next = prev; prev = curr; curr = next; } //最後一個curr是null,prev才是組後一個元素的地址,也就是新連結串列的頭結點。
return prev; }      //根據陣列建立連結串列  public ListNode create(int[] arr){ ListNode head = new ListNode(arr[0]); ListNode curr = head; for(int i = 1;i<arr.length;i++){ ListNode tmp = new ListNode(arr[i]); curr.next = tmp; tmp.next = null; curr = tmp; } return head; }      //給定連結串列頭節點,遍歷輸出連結串列 public void print(ListNode head){ ListNode curr = head; while(curr != null){ System.out.print(curr.val+" "); curr = curr.next; } } } //連結串列定義 class ListNode { int val; ListNode next; ListNode(int x) { val = x; } }