📜  反转双向链表的 C 程序

📅  最后修改于: 2022-05-13 01:57:39.376000             🧑  作者: Mango

反转双向链表的 C 程序

给定一个双向链表,任务是反转给定的双向链表。

例如,请参见下图。

(a) Original Doubly Linked List  

(b) Reversed Doubly Linked List  

这是一个反转双向链表的简单方法。我们需要做的就是交换所有节点的 prev 和 next 指针,更改 head(或 start)的 prev 并最终更改 head 指针。

C
/* C Program to reverse a doubly 
   linked list */
#include 
#include 
  
// A node of the doubly linked list 
struct Node
{
  int data;
  struct Node *next;
  struct Node *prev;    
};
  
/* Function to reverse a Doubly 
   Linked List */
void reverse(struct Node **head_ref)
{
     struct Node *temp = NULL;  
     struct Node *current = *head_ref;
       
     /* Swap next and prev for all nodes 
        of doubly linked list */
     while (current !=  NULL)
     {
       temp = current->prev;
       current->prev = current->next;
       current->next = temp;              
       current = current->prev;
     }      
       
     /* Before changing head, check for the 
        cases like empty list and list with 
        only one node */
     if(temp != NULL )
        *head_ref = temp->prev;
}     
  
// UTILITY FUNCTIONS 
/* Function to insert a node at the beginning 
   of the Doubly Linked List */
void push(struct Node** head_ref, 
          int new_data)
{
    // Allocate node 
    struct Node* new_node =
           (struct Node*) malloc(sizeof(struct Node));
   
    // Put in the data  
    new_node->data  = new_data;
      
    /* Since we are adding at the beginning, 
       prev is always NULL */
    new_node->prev = NULL;
   
    /* Link the old list off the new node */
    new_node->next = (*head_ref);    
  
    /* Change prev of head node to new node */
    if((*head_ref) !=  NULL)
      (*head_ref)->prev = new_node ;    
   
    /* move the head to point to the new node */
    (*head_ref)    = new_node;
}
  
/* Function to print nodes in a given 
   doubly linked list. This function is 
   same as printList() of singly linked list */
void printList(struct Node *node)
{
  while(node!=NULL)
  {
   printf("%d ", node->data);
   node = node->next;
  }
} 
  
// Driver code
int main()
{
  // Start with the empty list 
  struct Node* head = NULL;
   
  /* Let us create a sorted linked list 
     to test the functions. Created linked list 
     will be 10->8->4->2 */
  push(&head, 2);
  push(&head, 4);
  push(&head, 8);
  push(&head, 10);
   
  printf(
  "Original Linked list ");
  printList(head);
   
  // Reverse doubly linked list 
  reverse(&head);
   
  printf(
  "Reversed Linked list ");
  printList(head);           
   
  getchar();
}


输出:

Original linked list 
10 8 4 2 
The reversed Linked List is 
2 4 8 10

有关详细信息,请参阅有关反向双向链表的完整文章!