c语言单链表节点交换
时间: 2025-01-27 19:17:12 浏览: 61
### C语言中单链表节点交换的实现
在C语言中,为了实现在单链表中的两个节点之间的交换,通常有两种方式:一种是交换节点的数据部分;另一种则是调整指针使得两节点的位置互换。这里主要介绍后者。
对于需要交换的两个节点A和B,在实际编程过程中会涉及到前驱节点pre_A、待交换的第一个节点cur_A、第二个节点cur_B及其后继节点next_B等四个重要位置。当只考虑简单情况下的相邻节点交换时,可以简化为仅处理三个节点间的相互关系变化[^3]。
下面给出一段具体的代码示例来展示如何完成这一过程:
```c
// 定义单链表结构体
typedef struct ListNode {
int val;
struct ListNode *next;
}ListNode;
void swapNodes(ListNode **head, ListNode* a, ListNode* b){
if(a == NULL || b == NULL) return ;
// 如果a恰好位于b前面,则不需要额外寻找b的前置节点
bool is_adjacent = (a->next == b);
ListNode *prev_a = NULL,*prev_b = NULL,*current = *head;
// 寻找a,b各自的前置节点
while(current && current->next != a){
prev_a = current;
current = current->next;
}
if(!is_adjacent){
current = *head;
while(current && current->next != b){
prev_b = current;
current = current->next;
}
}
// 当至少有一个节点未被找到时退出函数
if (!a || !b) return;
// 处理头结点的情况
if(prev_a==NULL){
(*head)=b;
}else{
prev_a->next=b;
}
if(prev_b!=NULL&&!is_adjacent){
prev_b->next=a;
}
// 交换逻辑
ListNode* temp_next = b->next;
if(is_adjacent){
b->next=a;
a->next=temp_next;
}else{
b->next=a->next;
a->next=temp_next;
}
}
```
此段代码实现了任意给定两个非空节点`a`与`b`之间的一般化交换操作,并特别注意到了边界条件如其中一个节点可能是另一个节点的直接后续节点或者是头部节点等情况[^4]。
阅读全文
相关推荐



















