簡體   English   中英

隔離鏈接列表中的偶數和奇數節點

[英]Segregate even and odd nodes in a Linked List

鑒於,鏈接列表,我正在嘗試將其分區,以便偶數節點位於奇數節點之前。 我的方法是創建兩個不同的鏈表(偶數和奇數)來存儲偶數和奇數。 但是,當我想添加到偶數或奇數鏈表時,我遇到了一個問題(我評論了我認為在下面的代碼中給我帶來問題的部分)。 謝謝!

public class SeperateOddEven {

    static Node head;
    static int count;

    public static class Node {
        int data;
        Node next;

        private Node(int data) {
            this.data = data;
            next = null;
            count++;
        }

    }


    public void seperate() {

        Node even = null;
        Node odd = null;
        Node temp;

        // go through each linked-list and place node in new list depending on whether they are even or odd
        while(head != null) {
            // if even, place in even linked-list
            if(head.data % 2 == 0) {
                temp = new Node(head.data);
                even = temp; // Problem here
                even = even.next; // and here 
            } else { // if head.data % 2 != 0
                temp = new Node(head.data);
                odd = temp;
                odd = odd.next;
            }
            head = head.next;
        }

        toString(even);
        //toString(odd);

    }

    public void toString(Node node) {
        while (node != null) {
            System.out.print(node.data + " ");
            node = node.next;
        }
    }

    public static void main(String[] args) {

        SeperateOddEven s = new SeperateOddEven();
        head = new Node(8);
        head.next = new Node(12);
        head.next.next = new Node(10);
        head.next.next.next = new Node(5);
        head.next.next.next.next = new Node(4);
        head.next.next.next.next.next = new Node(1);
        head.next.next.next.next.next.next = new Node(6);

        System.out.println("original list: ");
        s.toString(head);

        s.seperate();
    }
}

我相信你確切地確定了問題所在。 我們一行一行:

temp = new Node(head.data);

多余的temp變量是不必要的,但很好。

even = temp;

但是,下一行會出現問題。 eventemp分配(使temp不必要)。 如果以前將某些內容存儲在even ,則該內容現在將丟失給垃圾收集器,因為您現在沒有對它的引用。 eventemp現在都是對同一個Node對象的引用。

我認為你可能想要做的是說even.next = temp 這將開始創建一個列表,但是只有一個引用,您將必須使用該引用來指向列表的開頭。 每次您想要追加到列表中時,都需要遍歷列表直到找到結尾。 如果你不是試圖使這個單一的參考點到列表的尾部,你將不再有什么辦法讓回頭,因為你的Node上唯一有next參考,而不是prev引用(雙向引用一個列表稱為雙向鏈表)。

even = even.next;

因為eventemp都指向新創建的Node對象,所以even.next屬性為null 因此,當此行執行時, even現在指向null。 循環內部的工作沒有任何效果,因為您立即丟失了對您創建的每個Node引用。


嘗試這樣的事情:

// Must keep track of head reference, because your Nodes can only go forward
Node evenHead = null;
Node evenTail = null;

Node oddHead = null;
Node oddTail = null;

while (head != null) {
    if(head.data % 2 == 0) {
        if (evenHead == null) {
            // The even list is empty, set the head and tail
            evenHead = new Node(head.data);
            evenTail = evenHead;
        } else {
            // Append to the end of the even list
            evenTail.next = new Node(head.data);
            evenTail = evenTail.next;
        }
    } else {
        // similar code for odd, consider creating a method to avoid repetition 
    }
}

您也可以嘗試以下方法:

while (head != null) {
            // if even, place in even linked-list
            temp = new Node(head.data);
            if (head.data % 2 == 0) {
                if(even == null) {
                    even = temp;
                } else{
                    Node insertionNode = even;
                    while(insertionNode.next != null) 
                        insertionNode = insertionNode.next;
                    insertionNode.next = temp;
                }


            } else { // if head.data % 2 != 0
                if(odd == null) {
                    odd = temp;
                } else{
                    Node insertionNode = odd;
                    while(insertionNode.next != null) 
                        insertionNode = insertionNode.next;
                    insertionNode.next = temp;
                }
            }
            head = head.next;
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM