链表划分为左小、中相等、右大

来源:互联网 发布:ubuntu查看mysql路径 编辑:程序博客网 时间:2024/04/30 14:29
解题思路:将一个链表分成三个链表,最后重新连接三个链表(1)分成三个链表的过程是一致的:以左小链表为例    依次遍历原链表的每一个节点cur,当cur->data<pivot时,把cur取出,添加到左小链表末尾,直到遍历完整个原链表为止。(2)生成左小、中相等、右大链表后,怎么连接三个链表并返回头结点是难点!    (因为不知道三个链表是否为空)
#include<iostream>using namespace std;typedef struct TNode{    int data;    struct TNode* next;}TNode;TNode* createL(int n) //创建链表{    TNode* head = NULL;    TNode* tial = NULL;    for (int i = 0; i < n; i++)    {        TNode* node = new TNode;        node->next = NULL;        cout << "请输入";        cin >> node->data;        if (head == NULL)        {            head = node;            tial = head;        }        else        {            tial->next = node;            tial = node;        }    }    tial->next = NULL;    return head;}void travel(TNode* head){    cout << "输出结果:" << endl;    TNode* p = head;    while (p != NULL)    {        cout << p->data << endl;        p = p->next;    }}TNode* listPartition(TNode* head, int pivot) //链表划分{    TNode* sh = NULL;    TNode* st = NULL;    TNode* eh = NULL;    TNode* et = NULL;    TNode* bh = NULL;    TNode* bt = NULL;    //依次遍历每一个元素    TNode* cur = head;    TNode* s = NULL;  //辅助变量,用于保存cur节点的下一个节点,防止断链    while (cur != NULL)    {        s = cur->next;        cur->next = NULL;//将当前结点cur的指针域设为空,保证每个链表的新增节点为最后一个节点        if (cur->data < pivot)        {            if (sh == NULL)            {                sh = cur;                st = cur;            }            else            {                st->next = cur;                st = cur;            }        }        else if (cur->data == pivot)        {            if (eh == NULL)            {                eh = cur;                et = cur;            }            else            {                et->next = cur;                et = cur;            }        }        else if (cur->data > pivot)        {            if (bh == NULL)            {                bh = cur;                bt = cur;            }            else            {                bt->next = cur;                bt = cur;            }        }        cur = s;    }    //难点:将三个不知道是否为空链表的链表进行链接成一条链表,返回最终的头结点//依次从左到右假设每个链表不为空时,尾节点指针域的指向    if (st != NULL)    {        st->next = (eh != NULL) ? eh : bh;    }    if (et != NULL)    {        et->next = bh;    }    return st != NULL ? sh : et != NULL ? eh : bh;}int main(){    TNode* head = NULL;    head = createL(7);    travel(head);    head = listPartition(head, 3);    travel(head);    return 0;}
阅读全文
0 0
原创粉丝点击