将链接列表拆分为两个(Split Linked List into two)

优质
小牛编辑
125浏览
2023-12-01

实现 (Implementation)

该算法的实现如下 -

#include <stdio.h>
#include <stdlib.h>
struct node {
   int data;
   struct node *next;
};
struct node *even = NULL;
struct node *odd = NULL;
struct node *list = NULL;
//Create Linked List
void insert(int data) {
   // Allocate memory for new node;
   struct node *link = (struct node*) malloc(sizeof(struct node));
   struct node *current;
   link->data = data;
   link->next = NULL;
   if(list == NULL) {
      list = link;
      list->next = link;
      return;
   }
   current = list;
   while(current->next != list)
      current = current->next;
   // Insert link at the end of the list
   current->next = link; 
   link->next = list;
}
void display(struct node *head) {
   struct node *ptr = head;
   printf("[head] =>");
   //start from the beginning
   while(ptr->next != head) {        
      printf(" %d =>",ptr->data);
      ptr = ptr->next;
   }
   printf(" %d =>",ptr->data);
   printf(" [head]\n");
}
void split_list() {
   int count = 0;
   // Allocate memory for new node;
   struct node *list1;
   struct node *link;
   struct node *current;
   list1 = list;
   while(list1->next != list) {
      struct node *link = (struct node*) malloc(sizeof(struct node));
      link->data = list1->data;
      link->next = NULL;
      if(list1->data%2 == 0) {
         if(even == NULL) {
            even = link;
            even->next = link;
            list1 = list1->next;
            continue;
         } else {
            current = even;
            while(current->next != even) {
               current = current->next;
            }
            // Insert link at the end of the list
            current->next = link; 
            link->next = even;
         }
         list1 = list1->next;
      } else {
         if(odd == NULL) {
            odd = link;
            odd->next = link;
            list1 = list1->next;
            continue;
         } else {
            current = odd;
            while(current->next!= odd) {
               current = current->next;
            }
            // Insert link at the end of the list
            current->next = link; 
            link->next = odd;
         }
         list1 = list1->next;
      }
   }
   // Lets handle the last node
   link = (struct node*) malloc(sizeof(struct node));
   link->data = list1->data;
   link->next = NULL;
   if(list1->data%2 == 0) {
      current = even;
      while(current->next != even) {
         current = current->next;
      }
      // Insert link at the end of the list
      current->next = link; 
      link->next = even;
   } else {
      current = odd;
      while(current->next!= odd) {
         current = current->next;
      }
      // Insert link at the end of the list
      current->next = link; 
      link->next = odd;
   }
}
int main() {
   int i;
   for(i = 1; i <= 10; i++)
      insert(i);
   printf("Complete list: \n");
   display(list);
   split_list();
   printf("\nOdd  : ");
   display(odd);
   printf("Even : ");
   display(even);
   return 0;
}

输出 (Output)

该方案的产出应该是 -

Complete list:
[head] => 1 => 2 => 3 => 4 => 5 => 6 => 7 => 8 => 9 => 10 => [head]
Odd  : [head] => 1 => 3 => 5 => 7 => 9 => [head]
Even : [head] => 2 => 4 => 6 => 8 => 10 => [head]
<!--

Download

You can download this program by clicking here. You can modify and execute the program on your computer systems and check the result. Compiling and execution process may vary from OS to OS and compiler to compiler.

-->