实现一个函数,将一个给定双向链表进行逆序排列(需给出双向链接数据结构)
时间: 2024-03-12 14:46:25 浏览: 17
以下是一个基于双向链表的逆序排列函数实现,双向链表的数据结构包括一个双向链表节点结构体`ListNode`和一个双向链表结构体`LinkedList`:
```c
typedef struct ListNode {
int val; // 节点值
struct ListNode* prev; // 指向前一个节点的指针
struct ListNode* next; // 指向后一个节点的指针
} ListNode;
typedef struct LinkedList {
ListNode* head; // 指向双向链表头节点的指针
ListNode* tail; // 指向双向链表尾节点的指针
} LinkedList;
LinkedList* reverseLinkedList(LinkedList* list) {
if (list == NULL || list->head == NULL) {
return list;
}
ListNode* curr = list->head;
ListNode* prev = NULL;
ListNode* next = NULL;
while (curr != NULL) {
next = curr->next;
curr->next = prev;
curr->prev = next;
prev = curr;
curr = next;
}
list->tail = list->head;
list->head = prev;
return list;
}
```
该函数接收一个双向链表的指针,首先判断输入是否为空或链表是否为空,如果是则直接返回。否则,定义三个指针变量`curr`、`prev`、`next`,分别指向当前节点、前一个节点和后一个节点。在遍历链表时,将当前节点的next指针指向前一个节点,将当前节点的prev指针指向后一个节点,然后将prev指针指向当前节点,curr指针指向next节点,继续遍历,直到遍历完整个链表。最后将链表的头节点指向原来的尾节点,尾节点指向原来的头节点,返回链表的指针即可。
需要注意的是,由于该函数涉及到修改链表节点的指针指向,因此在调用该函数前需要确保链表中的每个节点都已经正确地初始化其prev和next指针。