public void swap(int i, int j) {
current = head;
current2 = head;
sllNode temp = new sllNode(" ");
sllNode temp2 = new sllNode(" ");
for(int z = 0; i>z; z++)
current=current.next;
for(int q = 0; j>q; q++)
current2 = current2.next;
temp.next = current2.next.next;
current.next = temp;
current.next = current2.next.next;
current2.next = current;
要做到这一点,您需要交换两件事:将节点作为上一个节点的下一个节点,以及下一个节点。
找到要交换的节点的前两个节点后,请执行以下操作:
交换节点:
sllNode tmp = current.next;
current.next = current2.next;
current2.next = tmp;
然后交换下一个:
tmp = current.next.next;
current.next.next = current2.next.next;
current2.next.next = tmp;
为什么交换节点,当你可以交换数据?
public void swap(int i, int j) {
sllNode ithNode = head;
for (int z = 0; z < i; z++) {
ithNode = ithNode.next;
}
sllNode jthNode = head;
for (int q = 0; q < j; q++) {
jthNode = jthNode.next;
}
// Swap the data
String data = ithNode.data;
ithNode.data = jthNode.data;
jthNode.data = data;
}
使用一种方法是有意义的:
public sllNode get(int i) {
sllNode current = head;
while (i > 0) {
current = current.next;
}
return current;
}
顺便说一句:
SllNode
交换节点,这很难
在这里人们必须思考,所以最好先处理特殊情况,然后只处理i
public void swap(int i, int j) {
if (i >= size() || j >= size()) {
throw new IndexOutOfBoundsException();
}
if (i == j) {
return;
}
if (j < i) {
swap(j, i);
return;
}
// i < j
sllNode ithPredecessor = null;
sllNode ithNode = head;
for (int z = 0; z < i; z++) {
ithPredecessor = ithNode;
ithNode = ithNode.next;
}
sllNode jthPredecessor = ithNode;
sllNode jthNode = ithNode.next;
for (int q = i + 1; q < j; q++) {
jthPredecessor = jthNode;
jthNode = jthNode.next;
}
// Relink both nodes in the list:
// - The jthNode:
if (ithPredecessor == null) {
head = jthNode;
} else {
ithPredecessor.next = jthNode;
}
sllNode jNext = jthNode.next;
//if (ithNode.next == jthNode) {
if (jthPredecessor == ithNode) {
jthNode.next = ithNode;
} else {
jthNode.next = ithNode.next;
}
// - The ithNode:
if (jthPredecessor == ithNode) {
} else {
jthPredecessor.next = ithNode;
}
ithNode.next = jNext;
}
不能保证逻辑是好的。有诀窍:
//if (ithNode.next == jthNode) {
if (jthPredecessor == ithNode) {
这两个条件都测试是否
同时处理ith Node和jthNode,则使用单个i 1==j
,但是在. Next上进行测试,然后进行赋值,使得条件成为暂时状态。如您所见,如果(i 1==j){...}其他{...}会更容易。
我在Java中实现一个双链接列表时遇到了一个问题。特别是要交换2个以下节点(在我的例子中,一个节点包含一个政治候选人)。 假设下面的DLL: head- 作为输出,我没有从头到尾的正确DLL,但从头到尾都很好: 我已经写了几个版本的这个方法reverseTwoNode。我甚至尝试在节点内部交换数据,而不是交换节点,我也有同样的问题。你能帮我真是太好了,我花了这么多时间在这个简单的功能上,我看不出有
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
我在谷歌上搜索了这个,但他们都在谈论“交换节点而不交换数据”。 我尝试自己编写一个交换节点方法: 如您所见,和相互更改,但打印结果不交换。如何交换两个节点及其数据? 编辑:下面的完整示例
我已经在这上面困了半天了。我可以得到一些提示或指针,如何交换一个链表的头部和尾部(而不是反转整个列表),而不复制他们的数据吗? 如果我能看到代码并对它有一个解释,那就太棒了! 编辑: null 通过列表查找列表的第二个最后节点,并将其链接到头部。 将原来的头部链接到null,就像现在一样,头部应该被交换到尾部。
我遇到了一个问题,在这个问题中,您应该交换双链接列表中的一组节点。例如:对于列表
我正在尝试交换双链接列表中的两个节点。下面是具有交换功能的程序部分。 当我运行这个程序时,在第一个和第二个节点的情况下,它崩溃了。而在任何其他节点的情况下,它提供无限循环输出。(例如:-2- 我知道还有一些关于节点交换的问题,但是我没有找到任何与我的问题相似的问题。请帮帮我...!! 提前谢谢。