当前位置: 首页 > 知识库问答 >
问题:

Java双链表,交换节点

皇甫雨华
2023-03-14

我在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 ++;
}

共有2个答案

耿星雨
2023-03-14

删除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);
    }
}
别帅
2023-03-14

如果满足以下假设,则发布的代码有效:

  • N1和N2是相邻节点

检查一下: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