剣指Offer面接問題24:反転チェーンテーブルJavaコード実現
1789 ワード
タイトル:関数を定義し、チェーンテーブルのヘッダノードを入力し、そのチェーンテーブルを反転し、反転後のチェーンテーブルヘッダノードを出力します.
ノードを反転する場合、そのノードのポインタドメインを前のノードに向ける必要があるため、後続のノードにアクセスできません.したがって、現在のノード、前のノード、後のノードをそれぞれ指す3つのポインタが必要です.同様に、ヘッダノード付きチェーンテーブル構造は、最初のデータドメインがhead.nextであることに慣れています.コードは次のとおりです.
次の効果をテストします.
ここでprintStrはListNodeで定義された静的メソッドであり、チェーンテーブルデータを簡単に出力する.
出力は次のとおりです.
1->2->3 3->2->1
ノードを反転する場合、そのノードのポインタドメインを前のノードに向ける必要があるため、後続のノードにアクセスできません.したがって、現在のノード、前のノード、後のノードをそれぞれ指す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