単一リンクリスト反転の問題
1.問題の説明
1-> 2-> 3-> 4-> 5-> nullなどの単一リンクリストを逆にします
反転後の結果は5-> 4-> 3-> 2-> 1 ---> nullです。
2.解決策
リンクリストをトラバースする
リンクリストを配列に分割してから、逆の順序で配列をリンクリストにアセンブルします。
この方法は実装が簡単で、あまり多くのポインターを必要としません。欠点は、n単位のスペースが必要なことです。
Bポインタの逆順
3つのポインターは、現在のノード(p)、現在のノードの次のノード(q)、およびqの次のノード(r)を指します。rの存在は、qの次の値が失われないように、qの次のポインターをpを指すように変更することです。ソースコードは以下の通りです。
public class Node {
public int value;
public Node next;
public Node(int value) {
this.value = value;
}
public boolean hasNext() {
return next != null;
}
}
private static Node reverse(Node node) {
Node p = node;
Node q = p.next;
Node r;
p.next = null;
while (q != null) {
r = q.next;
q.next = p;
p = q;
q = r;
}
return p;
}
C再帰
まず、最初のノードの後の部分Dを全体として扱い、Dはすでに逆の順序になっていると考えます。次に行う必要があるのは、最初のノードとDノードで構成されるリンクリストの順序を逆にすることです。
次に、Dノード内の順序を逆にして、同じ考え方を使用して処理する必要があります。
繰り返しますが、再帰的出口は、Dノードの次が空の場合、Dノードが最後のノードであることを意味します。直接戻るだけです。
ソースコードは以下の通りです。
/**
*
* @param node 链表头结点
* @param pre 头结点逆序指向的节点
* @return
*/
private static Node reverseRecursion(Node node, Node pre) {
Node head = node;
Node pnext = head.next;
head.next = pre;
if (pnext == null) {
return head;
}
return reverseRecursion(pnext, head);
}
上記