我在Java中实现一个双链接列表时遇到了一个问题。特别是要交换2个以下节点(在我的例子中,一个节点包含一个政治候选人)。
假设下面的DLL:
head-
public static void reverseTwoNode(Node<Candidate> N1, Node<Candidate> N2){
N1.setNextNode(N2.getNextNode());
N2.setPreviousNode(N1.getPreviousNode());
if (N1.getNextNode() != null)
N1.getNextNode().setPreviousNode(N1);
if (N2.getPreviousNode() != null)
N2.getPreviousNode().setNextNode(N2);
N2.setNextNode(N1);
N1.setPreviousNode(N2);
}
作为输出,我没有从头到尾的正确DLL,但从头到尾都很好:
List of candidate
head-->Jacques-->Joseph-->Francis-->Gilbert-->tail
Reverse
tail-->Gilbert-->Francis-->Joseph-->Jacques-->head
Reverse nodes : Francis , Joseph
List of candidate
head-->Jacques-->Joseph-->Gilbert-->tail
Reverse
tail-->Gilbert-->Joseph-->Francis-->Jacques-->head
我已经写了几个版本的这个方法reverseTwoNode。我甚至尝试在节点内部交换数据,而不是交换节点,我也有同样的问题。你能帮我真是太好了,我花了这么多时间在这个简单的功能上,我看不出有什么干扰。。。提前谢谢,
也许这是显示方法的结果??
/* Display DLL from head to tail
* @see java.lang.Object#toString()
* @return str
*/
public String toString(){
String str = "List of candidate \n";
str += "head-->";
Node<Candidate> iterator = this.getHead();
while (iterator != null) {
str += iterator.getCandidate().getName();
str += "-->";
iterator = iterator.getNextNode();
}
return str + "tail";
}
/**
* Return string that display DLL from tail to head
* @return str
*/
public String reverseToString(){
String str = "Reverse\n";
str += "tail-->";
Node<Candidate> iterator = this.getTail();
while (iterator != null) {
str += iterator.getCandidate().getName();
str += "-->" ;
iterator = iterator.getPreviousNode();
}
return (str + "head");
}
解决方案:我的方法addNode是假的,这里是一个正确的方法,在尾部添加一个节点:
public void addNode(Node<Candidate> C){
if(tail == null){
this.head = C;
this.tail = C;
}
else{
this.tail.setNextNode(C);
this.tail.getNextNode().setPreviousNode(this.tail);
this.tail = this.tail.getNextNode();
this.tail.setNextNode(null);
}
this.size ++;
}
删除if语句,因为它们会阻止您移动头部和尾部节点(当一个节点实际指向null时,可能会导致奇怪的问题)。我还假设您希望交换两个节点,而不管它们的位置如何(不必是两个相邻的节点)。
这应该只是交换节点,并保持列表的其余部分不变。
public static void reverseTwoNode(Node<Candidate> N1, Node<Candidate> N2){
Node<Candidate> prevNode1 = N1.getPreviousNode();
Node<Candidate> nextNode1 = N1.getNextNode();
Node<Candidate> prevNode2 = N2.getPreviousNode();
Node<Candidate> nextNode2 = N2.getNextNode();
if(N2.getPreviousNode().equals(N1)) { // test for adjacent nodes
N2.setPreviousNode(prevNode1);
N2.setNextNode(N1);
N1.setNextNode(nextNode2);
N1.setPrevNode(N2);
} else {
N1.setPreviousNode(prevNode2);
N1.setNextNode(nextNode2);
N2.setPreviousNode(prevNode1);
N2.setNextNode(nextNode1);
}
}
如果满足以下假设,则发布的代码有效:
检查一下:http://ideone.com/3AKsBx
对于更通用的解决方案,您需要一些辅助变量来存储N1/N2的下一个和前一个引用。因为当您这样做时:
N1.setNextNode(N2.getNextNode());
N2.setPreviousNode(N1.getPreviousNode());
然后在:
if (N1.getNextNode() != null)
N1.getNextNode().setPreviousNode(N1);
N1。getNextNode()
不是原始值。这是N2。getNextNode()
由于N1。setNextNode(N2.getNextNode())
。
下面是一个例子:http://ideone.com/voaaTO
我正在尝试交换双链接列表中的两个节点。下面是具有交换功能的程序部分。 当我运行这个程序时,在第一个和第二个节点的情况下,它崩溃了。而在任何其他节点的情况下,它提供无限循环输出。(例如:-2- 我知道还有一些关于节点交换的问题,但是我没有找到任何与我的问题相似的问题。请帮帮我...!! 提前谢谢。
我试图交换链表中节点的位置,然后使用排序函数进行排序。这两个函数中的任何一个都有逻辑错误。当我运行这个程序时,它会无限循环。 更新代码
我遇到了一个问题,在这个问题中,您应该交换双链接列表中的一组节点。例如:对于列表
我在实现哈夫曼算法,为此我使用了一个双链表。实现需要对列表进行排序,但仅仅交换数据是不够的——我需要交换整个节点。然而,这比我预想的要复杂一些。 我使用了这个选择排序的变体,但它会导致访问冲突错误。我假设这是因为我试图访问某个空指针,这两个条件本应阻止它。 任何帮助或建议都将不胜感激。
024. Swap Nodes in Pairs[E] 题目 Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2->3->4, you should return the list as 2->1->4->3. Your algorithm should us