c语言单链表交换节点
时间: 2024-06-19 09:04:04 浏览: 194
单链表是由许多节点组成的链式结构,每个节点包含了一个数据域和一个指向下一个节点的指针。在交换单链表中的两个节点时,需要更改它们之间的指针指向关系。具体实现方式如下:
1. 定义两个指针p和q,分别指向要交换的节点。
2. 定义两个指针pre_p和pre_q,分别指向p和q的前驱节点。
3. 将pre_p的next指针指向q,将pre_q的next指针指向p。
4. 将p的next指针指向q的next指针所指向的节点,将q的next指针指向p的next指针所指向的节点。
5. 交换完成后,需要注意处理边界情况,即当p或q为头结点时,需要更新头结点的指针。
具体代码实现如下:
```c
typedef struct Node {
int data;
struct Node *next;
} Node;
void swap(Node *head, int x, int y) {
if (x == y) {
return;
}
Node *pre_x = NULL, *pre_y = NULL, *p = NULL, *q = NULL;
Node *cur = head->next;
while (cur) {
if (cur->data == x) {
pre_x = p;
p = cur;
} else if (cur->data == y) {
pre_y = q;
q = cur;
}
p && q ? break : 0;
p ? p = p->next : 0;
q ? q = q->next : 0;
pre_x && !p ? exit(0) : 0;
pre_y && !q ? exit(0) : 0;
pre_x && !pre_y && p == head->next ? head->next = q : 0;
pre_y && !pre_x && q == head->next ? head->next = p : 0;
cur = cur->next;
}
if (p && q) {
pre_x ? pre_x->next = q : 0;
pre_y ? pre_y->next = p : 0;
Node *temp = p->next;
p->next = q->next;
q->next = temp;
}
}
```
阅读全文