我正在尝试交换链表中两个相邻节点的地址。我试着用一个int-temp变量来交换它们的值,效果非常好。但现在,我想通过指针交换两个地址。不幸的是,它在while循环中创建了一个无限循环。这是我的代码片段:
使用int://工作得非常好
node* swapNumbers(node* head, int data){
int temp;
node *cursor = head;
while(cursor!=NULL){
if(cursor->data == data){
temp = cursor->data;
cursor->data = cursor->next->data;
cursor->next->data = temp;
//printf("1: %dn", cursor->data);
//printf("2: %dn", cursor->next->data);
return cursor;
}
cursor = cursor->next;
}
return NULL;
}
使用地址://这创建了一个无限循环!
node* swapNumbers(node* head, int data){
node *temp = NULL;
node *cursor = head;
while(cursor!=NULL){
if(cursor->data == data){
temp = cursor;
cursor = cursor->next;
cursor->next = temp;
return cursor;
}
cursor = cursor->next;
}
return NULL;
}
我的typedef结构包含以下内容:
typedef struct node
{
int data;
struct node* next;
} node;
我是C的新手,指针仍然让我困惑。任何帮助都将不胜感激!
为了不进入无限循环,需要将cursor
的前置值保存在另一个指针指向的临时值中。
我可以建议一种简单的方法来交换单链表中的两个节点吗?
/* p points to the node before a, a and b are the nodes to be swapped */
void swap_address(node* p, node* a, node* b)
{
node* n = b->next; /* save the address of the node after b */
if (!p || !a || !b)
{
printf("One of the arguments is NULL!n");
return;
}
p->next = b; /* p points to b */
b->next = a; /* b points to a */
a->next = n; /* a points to the node that was originally after b */
}
在我的机器上,我用以下结构定义进行了尝试:
typedef struct node
{
struct node* next;
int val;
} node;
我是这样用的:
swap_address(b, c, d);
我的节点head
->a
->b
->c
->d
的值依次为1、2、3和4。
交换后,顺序变为1->2->4->3。
这就是你想要的吗?
在代码中有三种情况需要处理。
-
如果数据节点是第一个节点。你必须改变头部指针。当你们传递的是唯一的指针时,你们不能改变,否则头是第二个元素。
-
如果数据节点是最后一个节点。你不能交换。
-
如果数据节点是中间节点。您需要光标的前一个,这样您就可以将其指向正确的节点。假设您有前一个节点
if(cursor->data == data) { temp = cursor; cursor = cursor->next; if (NULL == cursor) return NULL; temp->next = cursor->next; prev->next = cursor; cursor->next = temp; return cursor; }