当我试图为简单链接列表中的两个节点构建交换函数时,我遇到了一个奇怪的事情。
包含5个节点的列表。我通过了第一个节点和第三个节点:
//list is the head of the linked list
interchange(list, list->pNext->pNext);
以下是导致问题的唯一指令,使其更简单:
void interchange(SList*& p, SList*& q) {
p->pNext->pNext = q->pNext->pNext;
}
我的问题是,根据我对编码的理解,相同操作中的左侧成员获得正确成员的值。 p-> pNext-> pNext采用正确的值。 但指针名为" q"在此单一指令后将指向q-> pNext-> pNext。
有人能否对此有所了解? 提前谢谢你们。
答案 0 :(得分:0)
考虑对interchange(SList*& p, SList*& q)
的调用。
您将p = list
的值作为参考及其孙q = list->pNext->pNext
传递给它,也作为参考。
当您为p->pNext->pNext
分配q->pNext->pNext
时,您正在修改list->pNext->pNext
以指向list->pNext->pNext->pNext->pNext
。
自q = list->pNext->pNext
作为参考后,您还要将q
修改为指向list->pNext->pNext->pNext->pNext
;毕竟q
基本上是重命名的list->pNext->pNext
。
如果您将功能签名更改为void interchange(SList* p, SList* q)
,则不会修改q
,因为当您更改p->pNext->pNext
时,它现在只是一个基本指针。
答案 1 :(得分:0)
以下是您目前实施的逻辑
android {
..
lintOptions {
checkReleaseBuilds false
}
}
您将指针B替换为指向D的指针。p = list
q = list->pNext->pNext
p->pNext->pNext = q->pNext->pNext
// Same as
list->pNext->pNext = list->pNext->pNext->pNext->pNext
// Before list->A->B->C->D
// After list->A->D
仍然指向q
,现在指向list->pNext->pNext
的D,之前list->pNext->pNext->pNext->pNext
相当于q->pNext->pNext
}。
答案 2 :(得分:0)
您没有显示列表定义,但函数可以按以下方式显示
void interchange( SList*& p, SList*& q )
{
std::swap( p, q );
std::swap( p->next, q->next );
}
如示范程序中所示。
#include <iostream>
#include <utility>
struct SList
{
int data;
SList *next;
};
void push_front( SList * &head, int data )
{
SList *tmp = new SList { data, head };
head = tmp;
}
std::ostream & display( SList * &head, std::ostream &os = std::cout )
{
for ( const SList *current = head; current != nullptr; current = current->next )
{
os << current->data << ' ';
}
return os;
}
void interchange( SList*& p, SList*& q )
{
std::swap( p, q );
std::swap( p->next, q->next );
}
int main()
{
SList *head = nullptr;
const int N = 10;
for ( int i = N; i != 0; )
{
push_front( head, --i );
}
display( head ) << std::endl;
interchange( head, head->next->next );
display( head ) << std::endl;
return 0;
}
程序输出
0 1 2 3 4 5 6 7 8 9
2 1 0 3 4 5 6 7 8 9