java經典面試題:單鏈表反轉問題詳解(含遞迴法)
阿新 • • 發佈:2018-11-22
java經典面試題:單鏈表反轉問題,有兩種方法,一種為迴圈遍歷法,一種遞迴法。
1、迴圈遍歷法
首先設定三個節點,把當前節點的下一節點指向它前面的節點,此時你會發現指標鏈會斷,所以要先把它後面一個節點用nextNode儲存下來,之後把節點向後移動遍歷即可。
程式碼如下:
//定義單鏈表節點類 public class ListNode { int value; ListNode next; public ListNode() { this.value=0; this.next=null; } public ListNode(int value) { this.value=value; } } //定義連結串列反轉方法 public ListNode reverseList(ListNode root) { if(root==null)return root; ListNode newhead=null; //反轉後的新連結串列頭結點 ListNode preNode = null; //前一節點 ListNode nextNode=null; //下一節點 ListNode curNode=root; //當前節點 while(curNode.next!=null) { nextNode=curNode.next; //儲存當前節點的下一節點 curNode.next=preNode; //使當前節點指向前一節點 preNode=curNode; //把前一節點往後移 curNode=nextNode; //把當前節點往後移 } newhead=curNode; return newhead; }
2、遞迴法
如果當前節點或者當前節點的下一節點為空,直接返回該節點;
否則使該節點的後一節點指向該節點,以此遞迴。
public BinaryNode reverseList2(BinaryNode root) { if(root==null||root.next==null)return root; BinaryNode nextNode=root.next; //得到當前節點的下一節點 root.next=null; //打斷當前指標鏈 BinaryNode re=reverseList2(nextNode); //每次遞迴下一節點進行反轉 nextNode.next=root; //反轉指標域 return re; }