链表分割

题目描述:编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。

  • 示例:2->4->1->5->9->3->6->null, x = 5
  • 输出:2->4->1->3->5->9->6->null

思路:定义两个新链表,一个存储比 x 值小的结点,另一个存储大于等于 x 的值的结点,最后将两个链表连接起来。

注意:

  1. 如果分割后前一个链表为 null,直接返回后一个链表。
  2. 如果分割后后一个链表为 null,直接返回前一个链表。后一个链表不为空,则返回连接后的链表。
public class Partition {
    public ListNode partition(ListNode pHead, int x) {
/*
        遍历整个链表,把小于 x 的尾插到一个小链表
                      把大于等于 x 的尾插到一个大链表中
        理想情况下,把大链表接到小链表后边
        1) 如果没有小链表,直接返回大链表(大链表可能为空)

        保证,返回链表的最后一个结点.next == null
        lessLast / greatLast
         */
        /* 尾插
        1. 先情况讨论:
            1)如果当前链表为空,要插入的结点就是链表的第一个结点
            2) 如果链表不为空,
                1. 先找到当前的最后一个结点
                2. 让当前的最后一个结点的 next = 要插入的结点
                3. 如果每次的最后一个结点都是我们插入的
                    可以记录上次插入的最后一个结点
                4. 不要忘记更新最后一个结点
         */
         
        ListNode before = null;
        ListNode after = null;
        ListNode last1 = null;
        ListNode last2 = null;
        ListNode cur = pHead;
        
        while(cur != null){
            if(cur.val < x){
                if(before == null){
                    before = cur;
                }else{
                    last1.next = cur;
                }
                last1 = cur;
            }else{
                if(after == null){
                    after = cur;
                }else{
                    last2.next = cur;
                }
                last2 = cur;
            }
            cur = cur.next;
        }
        if(before == null){
            return after;
        }else{
            last1.next = after;
            if(after != null){
                last2.next = null;
            }
            return before;
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值