用c语言写,一个带头结点的单链表L中,试编写算法交换给定元素值k所在的节点与其后继节点
时间: 2025-01-05 14:47:48 浏览: 35
在C语言中,我们可以创建一个函数来交换指定元素值 `k` 所在的节点与其后继节点。这里假设我们有一个简单的链表结构定义,包含一个整数值和指向下一个节点的指针。首先,我们需要找到给定值 `k` 的节点,然后将它的前驱和后继节点链接起来。
以下是一个简单的示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int val; // 节点值
struct ListNode* next; // 指向下一个节点的指针
} ListNode;
// 插入节点到链表
void insert(ListNode** head, int val) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = val;
newNode->next = *head;
*head = newNode;
}
// 查找值为 k 的节点
ListNode* findNode(ListNode* head, int k) {
ListNode* current = head;
while (current != NULL && current->val != k) {
current = current->next;
}
return current;
}
// 交换节点及其后继节点
void swapNodes(ListNode** head, int k) {
if (*head == NULL || (*head)->val != k) {
printf("Element not found or list empty.\n");
return;
}
ListNode* nodeToSwap = findNode(head, k);
ListNode* temp = nodeToSwap->next;
nodeToSwap->next = temp->next;
if (temp->next != NULL)
temp->next->prev = nodeToSwap; // 更新后继节点的前驱
temp->next = nodeToSwap;
nodeToSwap->prev = temp; // 如果有后继,更新其前驱
}
// 打印链表
void printList(ListNode* head) {
ListNode* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->val);
temp = temp->next;
}
printf("NULL\n");
}
int main() {
// 初始化链表和值
ListNode* head = NULL;
insert(&head, 1); // 示例:[1]
insert(&head, 2); // 示例:[1, 2]
insert(&head, 3); // 示例:[1, 2, 3]
int k = 2;
printf("Original List: ");
printList(head);
swapNodes(&head, k);
printf("After swapping with %d: ", k);
printList(head);
return 0;
}
```
在这个程序中,我们首先定义了链表节点和相关的操作,如插入节点、查找节点和打印链表。`swapNodes` 函数用于找到并交换指定元素 `k` 的节点及其后继。注意,这个例子假设链表中存在值为 `k` 的节点,并且后继节点存在。
阅读全文
相关推荐


















