C语言双向循环链表任意节点交换实现详解
要实现双向循环链表中任意两个数据节点的位置交换,可以按照以下步骤进行:\n\n1. 定义双向循环链表的节点结构体,包含数据域和指向前一个节点和后一个节点的指针。\n c\n struct Node {\n int data;\n struct Node* prev;\n struct Node* next;\n };\n \n\n2. 创建双向循环链表,并插入一些节点。\n c\n // 创建双向循环链表\n struct Node* createList(int data) {\n struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));\n newNode->data = data;\n newNode->prev = NULL;\n newNode->next = NULL;\n return newNode;\n }\n\n // 在链表末尾插入节点\n void insertEnd(struct Node** head, int data) {\n struct Node* newNode = createList(data);\n if (*head == NULL) {\n *head = newNode;\n (*head)->prev = *head;\n (*head)->next = *head;\n } else {\n struct Node* last = (*head)->prev;\n newNode->next = *head;\n newNode->prev = last;\n last->next = newNode;\n (*head)->prev = newNode;\n }\n }\n\n // 打印链表\n void printList(struct Node* head) {\n struct Node* current = head;\n do {\n printf("%d ", current->data);\n current = current->next;\n } while (current != head);\n printf("\n");\n }\n \n\n3. 实现位置交换函数。\n c\n // 交换两个节点的位置\n void swapNodes(struct Node** head, int x, int y) {\n // 如果x和y相同,无需交换\n if (x == y) {\n return;\n }\n\n struct Node* currX = *head;\n struct Node* prevX = NULL;\n while (currX->data != x) {\n prevX = currX;\n currX = currX->next;\n }\n\n struct Node* currY = *head;\n struct Node* prevY = NULL;\n while (currY->data != y) {\n prevY = currY;\n currY = currY->next;\n }\n\n // 如果x或y不在链表中,无法交换\n if (currX == NULL || currY == NULL) {\n return;\n }\n\n // 如果x是头结点,更新头指针\n if (prevX == NULL) {\n *head = currY;\n } else {\n prevX->next = currY;\n }\n\n // 如果y是头结点,更新头指针\n if (prevY == NULL) {\n *head = currX;\n } else {\n prevY->next = currX;\n }\n\n // 交换节点的前后指针\n struct Node* temp = currY->next;\n currY->next = currX->next;\n currX->next = temp;\n\n temp = currY->prev;\n currY->prev = currX->prev;\n currX->prev = temp;\n }\n \n\n4. 测试交换函数。\n c\n int main() {\n struct Node* head = NULL;\n insertEnd(&head, 1);\n insertEnd(&head, 2);\n insertEnd(&head, 3);\n insertEnd(&head, 4);\n insertEnd(&head, 5);\n\n printf("链表初始状态:");\n printList(head);\n\n swapNodes(&head, 2, 4);\n\n printf("交换节点后:");\n printList(head);\n\n return 0;\n }\n \n\n运行以上代码,输出结果为:\n\n链表初始状态:1 2 3 4 5 \n交换节点后:1 4 3 2 5 \n\n可以看到,节点2和节点4的位置已经交换。\n
原文地址: https://www.cveoy.top/t/topic/qbMh 著作权归作者所有。请勿转载和采集!