![](/img/trans.png)
[英]How to segregate a linked list into two other lists, one with odd indices the other one with even indices but in recursion way
[英]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;
但是,下一行會出現問題。 您even
為temp
分配(使temp不必要)。 如果以前將某些內容存儲在even
,則該內容現在將丟失給垃圾收集器,因為您現在沒有對它的引用。 even
和temp
現在都是對同一個Node
對象的引用。
我認為你可能想要做的是說even.next = temp
。 這將開始創建一個列表,但是只有一個引用,您將必須使用該引用來指向列表的開頭。 每次您想要追加到列表中時,都需要遍歷列表直到找到結尾。 如果你不是試圖使這個單一的參考點到列表的尾部,你將不再有什么辦法讓回頭,因為你的Node
上唯一有next
參考,而不是prev
引用(雙向引用一個列表稱為雙向鏈表)。
even = even.next;
因為even
和temp
都指向新創建的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.