程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> 如何使用遞歸和非遞歸方式反轉單向鏈表

如何使用遞歸和非遞歸方式反轉單向鏈表

編輯:更多關於編程
    以下是對使用遞歸和非遞歸方式反轉單向鏈表的示例進行了詳細的分析介紹,需要的朋友可以過來參考下  

    問題:
    給一個單向鏈表,把它從頭到尾反轉過來。比如: a -> b -> c ->d 反過來就是 d -> c -> b -> a 。

    分析:
    假設每一個node的結構是:

    復制代碼 代碼如下:
    class Node {
     char value;
     Node next;
    }


    因 為在對鏈表進行反轉的時候,需要更新每一個node的“next”值,但是,在更新 next 的值前,我們需要保存 next 的值,否則我們無法繼續。所以,我們需要兩個指針分別指向前一個節點和後一個節點,每次做完當前節點“next”值更新後,把兩個節點往下移,直到到達最 後節點。

    代碼如下:

    復制代碼 代碼如下:
    public Node reverse(Node current) {
     //initialization
     Node previousNode = null;
     Node nextNode = null;

     while (current != null) {
      //save the next node
      nextNode = current.next;
      //update the value of "next"
      current.next = previousNode;
      //shift the pointers
      previousNode = current;
      current = nextNode;   
     }
     return previousNode;
    }


    上面代碼使用的是非遞歸方式,這個問題也可以通過遞歸的方式解決。代碼如下:

    復制代碼 代碼如下:
    public Node reverse(Node current)
     {
         if (current == null || current.next == null) return current;
         Node nextNode = current.next;
         current.next = null;
         Node reverseRest = reverse(nextNode);
         nextNode.next = current;
         return reverseRest;
     }


    遞歸的方法其實是非常巧的,它利用遞歸走到鏈表的末端,然後再更新每一個node的next 值 (代碼倒數第二句)。 在上面的代碼中, reverseRest 的值沒有改變,為該鏈表的最後一個node,所以,反轉後,我們可以得到新鏈表的head。

     

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved