剣指Offer面接問題24:反転チェーンテーブルJavaコード実現


タイトル:関数を定義し、チェーンテーブルのヘッダノードを入力し、そのチェーンテーブルを反転し、反転後のチェーンテーブルヘッダノードを出力します.
ノードを反転する場合、そのノードのポインタドメインを前のノードに向ける必要があるため、後続のノードにアクセスできません.したがって、現在のノード、前のノード、後のノードをそれぞれ指す3つのポインタが必要です.同様に、ヘッダノード付きチェーンテーブル構造は、最初のデータドメインがhead.nextであることに慣れています.コードは次のとおりです.
public static ListNode reversedList(ListNode head){
		//                      head.next
		//cur           ,pre    
		ListNode reversedHead=new ListNode();
		ListNode pre=null;
		ListNode cur=head.next;
		
		//     next  ,       ,   head next       
		while(cur!=null){
			ListNode next=cur.next;
			if(next==null){
				reversedHead.next=cur;
			}
			
			//    next           
			cur.next=pre;
			pre=cur;
			cur=next;
		}
		//      head     head next            
		return reversedHead;
	}

次の効果をテストします.
public static void main(String[] args) {
		// TODO Auto-generated method stub
		ListNode head=new ListNode();
		ListNode node1=new ListNode();
		ListNode node2=new ListNode();
		ListNode node3=new ListNode();
		
		head.next=node1;
		node1.value=1;
		node1.next=node2;
		node2.value=2;
		node2.next=node3;
		node3.value=3;
		ListNode.printStr(head);
		
		ListNode reversedHead=reversedList(head);
		ListNode.printStr(reversedHead);
		ListNode.printStr(reversedList(new ListNode()));
	}

ここでprintStrはListNodeで定義された静的メソッドであり、チェーンテーブルデータを簡単に出力する.
public static void printStr(ListNode head) {
		if (head == null)
			return;
		ListNode pNode = head.next;
		while (pNode != null) {
			if(pNode.next==null){
				System.out.print(pNode.value);
				System.out.println();
				pNode = pNode.next;
			}else{
				System.out.print(pNode.value);
				System.out.print("->");
				pNode = pNode.next;
			}
		}
	}
}

出力は次のとおりです.
1->2->3 3->2->1