如果我们有这样的结构(链表的节点):
struct Node{
int data;
struct Node* next;
}
我们有2个指针(a和b),这样
a->next = b;
如何交换两个指针a和b(以便a->next = b->next
和b->next = a
)?我试过这样的事情:
a->next = b->next;
b->next = a;
但它似乎无法正常工作......此代码段有什么问题? a->next
最终指向自己吗?通过这样做a->next = b->next
,我们是否a->next
指向b->next
指向的任何内容,或者我们是否指出b->next
在指派时指向的内容?
男人,指针令人困惑..任何帮助表示赞赏!
答案 0 :(得分:2)
我假设有2个Node
个对象(让我称之为n0
和n1
)和两个变量a
和b
指向{{分别为1}}和n0
。此外,每个n1
都有自己的指针。这让我们最初有4个指针看起来像:
Node
以及这两项任务后发生的事情:
a -> n0
b -> n1
n0.next -> n1
n1.next -> ?
到目前为止没有任何可疑之处。正如他们所说,"矛盾不存在 - 检查你的假设"。因此,// a->next = b->next;
a -> n0
b -> n1
n0.next -> ?
n1.next -> ?
// b->next = a;
a -> n0
b -> n1
n0.next -> ?
n1.next -> n0
和a
最初可能没有指向正确的位置?可能只有一个b
,您可以设置如下设置:
Node
仍然具有问题中a -> n0
b -> n0
n0.next -> n0
的属性,但看起来完全不同。
在其他地方查找错误。
答案 1 :(得分:2)
想象你想要做的事情:
A B C | data | | data | | data | | next | -> | next | -> | next | -> NULL
这是你的初始状态。让我们逐步完成您的代码,看看它是否会导致您尝试实现的目标。首先,你有这个:
a->next = b->next;
执行此声明后,您将拥有:
A C | data | | data | | next | -> | next | -> NULL B C | data | | data | | next | -> | next | -> NULL
下一个陈述是:
b->next = a;
执行此声明后,您最终会得到:
B A C | data | | data | | data | | next | -> | next | -> | next | -> NULL
您已达到理想的结果。你的逻辑是正确的。
答案 2 :(得分:0)
当您指定a->next = b->next;
时,您丢失了a-next
的指针,那么该怎么做:
struct Node * tmp;
tmp = a->next;
a->next = b->next;
b->next = tmp;