単一のリンクリスト反転のJavaの単純な実現

単一リンクリスト反転の問題

 

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);
    }


上記

 

おすすめ

転載: blog.csdn.net/zibaihe007/article/details/78683480