链表的分化练习题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/laoxuan2011/article/details/55505845

对于一个链表,我们需要用一个特定阈值完成对它的分化,使得小于等于这个值的结点移到前面,大于该值的结点在后面,同时保证两类结点内部的位置关系不变。
给定一个链表的头结点head,同时给定阈值val,请返回一个链表,使小于等于它的结点在前,大于等于它的在后,保证结点值不重复。
测试样例:
{1,4,2,5},3
{1,2,4,5}

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class Divide {
public:
    ListNode* listDivide(ListNode* head, int val) {
        // write code here
        if(!head)
            return head;
        // <= > 子链表的结点的前一个结点 头结点

        ListNode LowerNode(-1);
        ListNode HigherNode(-1);

        ListNode * pHead = head;
        ListNode * pLow = &LowerNode;
        ListNode * pHigh = &HigherNode;
        while(pHead){
            if(pHead->val <= val){
                pLow->next = pHead;
                pLow = pLow->next;
            }else{
                pHigh->next = pHead;
                pHigh = pHigh->next;
            }
            pHead = pHead->next;
        }
        //拼接子链表 LowerNode是指向第一个节点结点的
        pLow->next = HigherNode.next;
        pHigh->next = NULL;  // 第二个子链表尾结点为空 
        return LowerNode.next;//LowerNode是指向第一个节点结点的头结点

    }
};

猜你喜欢

转载自blog.csdn.net/laoxuan2011/article/details/55505845