C语言的单链表分割
已知鏈表頭指針head與數值x,將所有小于x的節點放在大于或等于x 的節點前,且保持這些節點的原來的相對位置。
這個過程有點類似于快速排序,尋找一個閾值,比該閾值小的放左邊,比該閾值大的放右邊。只是由數組遍歷變為來鏈表遍歷,操作變成了指針的指向。
具體步驟如下:
- 創建一個less_ptr,負責對less端的鏈表進行維護
- 創建一個more_ptr,負責對more端的鏈表進行維護
- 最終進行less的尾和more的頭進行合并,返回頭節點。
這個過程需要注意保存less端和more端的頭節點,算法實現如下
Data *part_list(Data *head, int n) {Data less_head;Data more_head;less_head.data = 0;less_head.next = NULL;more_head.data = 0;more_head.next = NULL;Data *less_ptr = &less_head;Data *more_ptr = &more_head;/*遍歷鏈表,將大于n的放在右端,小于等于n的放在左端*/while(head) {if(head->data > n){more_ptr->next = head;more_ptr = head;} else {less_ptr->next = head;less_ptr = head;}head = head->next;}/*連接小端的尾和大端的頭,并將大端的尾置空*/less_ptr->next = more_head.next;more_ptr->next = NULL;/*返回小端的頭,因為此時它是鏈表的表頭*/return less_head.next;
}
源代碼測試如下:
#include <stdio.h>
#include <stdlib.h>typedef struct Link_list
{/* data */int data;struct Link_list *next;
}Data;/*打印鏈表*/
void print_list(Data *head) {while (head) {printf("%d ",head->data);head = head -> next;}printf("\n");
}/*尾插法創建鏈表*/
Data *insert_tail(Data *head, int n) {head = (Data *)malloc(sizeof(Data));head->next = NULL;Data *r = head;int b;while(n--){scanf("%d",&b);Data *p = (Data *)malloc(sizeof(Data));p->data = b;r->next = p;p->next = NULL;r = p;}return head;
}/*分割鏈表*/
Data *part_list(Data *head, int n) {Data less_head;Data more_head;less_head.data = 0;less_head.next = NULL;more_head.data = 0;more_head.next = NULL;Data *less_ptr = &less_head;Data *more_ptr = &more_head;while(head) {if(head->data > n){more_ptr->next = head;more_ptr = head;} else {less_ptr->next = head;less_ptr = head;}head = head->next;}less_ptr->next = more_head.next;more_ptr->next = NULL;return less_head.next;
}int main(){Data *head;int i ,b ;printf("construct link list :\n");head = insert_tail(head,5);Data *test = head -> next;print_list(test);printf("after part list :\n");/*設置3為閾值,大于3的都放在右端,小于等于3的都放在左端*/Data *part = part_list(head->next,3);print_list(part);return 0;
}
輸出如下:
construct link list :
5 4 3 2 1
5 4 3 2 1
after part list :
3 2 1 5 4
總結
- 上一篇: 华为手机换屏多少钱啊?
- 下一篇: C语言的有序单链表合并