我正在尝试在java中的链表中切换两个节点,并且遇到了一些问题。当我通过切换节点的内容来检查它时,我的排序算法正常工作,但是当试图切换节点本身时,我遇到了问题。
以下是我的节点切换代码:
Node tmp = current;
tmp.next = current.next.next;
Node tmp2 = current.next;
tmp2.next = current;
current.next = tmp;
current = tmp2;
然而,使用此代码,我的循环保持循环,所以我确信我的切换逻辑存在问题。如果有人能帮我解决这个问题,我会非常感激。
**澄清:我的目标是切换当前和当前。
谢谢!
答案 0 :(得分:1)
你快到了。回到我在大学时这样做时,为了交换2个节点,你想要抓住你想要交换的第一个节点之前的节点。例如。如果你有
----> currNode -> node_A -> node_B -> node_C ------>
我们希望将node_A
与node_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)
试试这段代码。我使用的命名约定略有不同,但代码是在current
和current.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;
希望它可以帮助任何可能像我一样被卡住的人!