在链表java中切换节点时遇到问题

时间:2016-05-03 00:05:04

标签: java linked-list logic

我正在尝试在java中的链表中切换两个节点,并且遇到了一些问题。当我通过切换节点的内容来检查它时,我的排序算法正常工作,但是当试图切换节点本身时,我遇到了问题。

以下是我的节点切换代码:

                Node tmp = current;
                tmp.next = current.next.next;

                Node tmp2 = current.next;
                tmp2.next = current;


                current.next = tmp;
                current = tmp2;

然而,使用此代码,我的循环保持循环,所以我确信我的切换逻辑存在问题。如果有人能帮我解决这个问题,我会非常感激。

**澄清:我的目标是切换当前和当前。

谢谢!

4 个答案:

答案 0 :(得分:1)

你快到了。回到我在大学时这样做时,为了交换2个节点,你想要抓住你想要交换的第一个节点之前的节点。例如。如果你有

----> currNode -> node_A -> node_B -> node_C ------>

我们希望将node_Anode_B交换,因此我们停在currNode,因为我们需要将currNode.next设置为node_B

在此之后,我们有以下内容(我假设它将被传递到某个方法中):

Node tmp = curr;
Node A = curr.next;
Node B = curr.next.next;
Node C = curr.next.next.next;

现在我们只需要设置正确的东西。

tmp.setNext(B);  //Now we have ----> tmp -> B
B.setNext(A);   //Now we have  ----> tmp -> B -> A
A.setNext(C);   //Now we have ----> tmp -> B -> A -> C --->

现在,如果node_A碰巧是第一个节点,或者node_B恰好是最后一个节点,那么您可能需要记住一些额外的条件。
您可以判断node_A恰好是链接列表中的第一个节点,您可以查看以下内容:

public void swap (NodeStructure nodeStructure, Node Node_A, Node Node_B){
    Node A = Node_A;
    Node B = Node_b;
    if(nodeStructure.head == A){
       //Node A is the first Node, so we need to handle it in a special way.
       Node tmp = Node_A;
       nodeStructure.setHead(B); //Now we have -> B
       B.setNext(tmp);           //Now we have -> B -> A
       A.setNext(C);             //Now we have -> B -> A -> C ------>
    }

    //or in the case of the tail 

    if(nodeStructure.tail == B){
       //Node B is the last Node, in this case, we don't need node_C
       /*Iterate through nodeStructure until you reach node before A and  
         assign this to tmp.*/
       nodeStructure.setTail(A); //Let's set the tail first
       tmp.setNext(B);  //Now we have ----> tmp -> B
       B.setNext(A);   //Now we have  ----> tmp -> B -> A
    }

     /* Depeding on how you decide to implement, you might also have a third 
        condition checking if Node_A is the head and Node_B is tail.*/

    //Handle condition where there's no special cases.
}

答案 1 :(得分:0)

Node tmp = current;
tmp.next = current.next.next;

上面的代码首先获取当前节点并使tmp指向它。然后它会更改tmp的下一个。问题是,这也将改变current,因为他们指向同一件事。

你想要这样的东西:

Node tmp = current.next.next;
current.next.next = current;
current.next = tmp;

答案 2 :(得分:0)

试试这段代码。我使用的命名约定略有不同,但代码是在currentcurrent.next交换节点。

Node head = current.next; // the node to become the start of the list (may be null)

if (head != null) {
  // swap current node's position
  current.next = head.next;
  head.next = current;

  // update the node current is pointing to
  current = head;
}

视觉上这就是发生的事情:

Current -> B -> Rest of List...将成为B -> Current -> Rest of List...

答案 3 :(得分:0)

好的,我终于明白了!

我完全错了。这只是一个重新连接的问题。以下是我的解决方案:

                Node temp = current;
                Node prevNext = prev.next;
                Node currentNext = current.next;
                Node currentNextNext = current.next.next;


                current.next.next = temp;
                current.next = currentNextNext;
                prev.next = currentNext;

希望它可以帮助任何可能像我一样被卡住的人!