链表(篇8)给定链表及K将链表中的节点按小于K等于K大于K排列不改变它们原来次序

来源:互联网 发布:青蛙寿命 知乎 编辑:程序博客网 时间:2024/05/16 11:28

给定一个链表和值k,将其排序,使得小于x的所有节点首先,然后所有节点的值等于x,最后节点的值大于或等于x。应保留三个分区中的每一个中的节点的原始相对顺序。
例子:

输入:1-> 4-> 3-> 2-> 5-> 2-> 3         x = 3输出:1-> 2-> 2-> 3-> 3-> 4-> 5输入:1-> 4-> 2-> 10         x = 3输出:1-> 2-> 4-> 10输入:10-> 4-> 20-> 10-> 3         x = 3输出:3-> 10-> 4-> 20-> 10 

思路:
将原链表中的节点依次取下来插到新的头节点后,如果节点值大于K则将其放到新链表的最后,如果节点值小于K则将其放到节点值小于k的最后,若等于k就放到等于k的最后。


代码:


public ListNode Partitioning(ListNode head,int k)    {        ListNode phead=new ListNode(0);        //产生一个新的头节点        ListNode curr,next,pre;        curr=head;        if(curr==null||curr.next==null)        {            return head;            //如果链表为空或者链表中只有一个元素则直接返回链表。        }        while(curr!=null)        {            System.out.println(curr.val);            next=curr.next;            curr.next=null;            pre=phead;            if(curr.val<k)            {            //如果从链表中取下的节点值小于K,将其插入到小于所有小于k的节点的最后                while(pre.next!=null&&pre.next.val<k)                {                    pre=pre.next;                }                if(pre.next==null)                {                    pre.next=curr;                }                else {                    curr.next=pre.next;                    pre.next=curr;                }            }            else if(curr.val==k){            //如果取下来的节点值等于k将其放到所有等于K的节点的最后                while(pre.next!=null&&pre.next.val<=k)                {                    pre=pre.next;                }                if(pre.next==null)                {                    pre.next=curr;                }                else {                    curr.next=pre.next;                    pre.next=curr;                }            }            else if(curr.val>k)            {             //如果节点值等于K则将其插入到链表的最后。                while(pre.next!=null)                {                    pre=pre.next;                }                pre.next=curr;            }            curr=next;        }        return phead.next;    }
0 0