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

版权声明:本文为博主原创文章,转载请说明。 https://blog.csdn.net/GoJawee/article/details/77961452
解题思路:将一个链表分成三个链表,最后重新连接三个链表
(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;
}

猜你喜欢

转载自blog.csdn.net/GoJawee/article/details/77961452