【小咲详解】 链表分割,给定值小的放到前面,比给定值大的放到后面

 

链表分割

编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前。

给定一个链表的头指针 Node Head,x的值为分割基准数,请返回重新排列后的链表的头指针。
(注意:分割以后保持原来的数据顺序不变)

示例:

  • 输入:9->3->6->8->10x = 7
  • 输出:3->6->9->8->10

初始:初始化结点(指针),

cur指向头结点head,small ,smallLast,big,bigLast初始化为空,之后介绍其作用

Node cur = head;
        Node small = null;
        Node smallLast = null;
        Node big = null;
        Node bigLast = null;

解题思路 

创建两条链表,小于给定值放入small指向的小链表的头结点,大于此给定值放入big指向的大链表的头结点,然后通过小链表的尾结点指针和big的头结点将两条链表合并起来。

判断极端条件,如果链表为空,既给定值也无法分割,直接返回空。
那么如果small指向的小链表为空?big指向的大链表为空?

small指向的小链表为空,排除本身链表为空的情况,说明只有big引导的大链表,return big

big指向的大链表为空,return small
————————————————————————————————————————————————————————

代码框架 (核心)

while (cur != null) {//while循环
            if (cur.val < x) {//小链表
                
             } 
            else {//大链表
                
             }
            cur = cur.next;//指针移动
        }

链表如何处理

首先是图解法

大链表和小链表两者处理情况相同,先说明小链表的处理情况

小链表代码说明

if(cur.val<x)如何循环呢

首先走一遍,第一遍

small=cur;

smallLast=cur;

cur=cur.next;

第二遍

smallLast.next=cur;

smallLast=cur;

cur=cur.next;

 if (cur.val < x) {
                // 把 cur 尾插到 small
                if (small == null) {
                    small = cur;
                } else {
                    smallLast.next = cur;//smallLast标记small(头结点)引导的链表
                }
                smallLast = cur;
            }

 大小链表的处理

 while (cur != null) {
            if (cur.val < x) {
                // 把 cur 尾插到 small
                if (small == null) {
                    small = cur;
                } else {
                    smallLast.next = cur;
                }
                smallLast = cur;
            } else {
                // 把 cur 尾插到 big
                if (big == null) {
                    big = cur;
                } else {
                    bigLast.next = cur;
                }
                bigLast = cur;
            }
            cur = cur.next;
        }

特殊情况

if (smallLast == null) {
            return big;//smallLast标记为空,返回大链表的头结点
        } else {
            smallLast.next = big;//正常情况小链表尾部指向大链表头结点
        }

        if (bigLast == null) {
            return small;//没有比给定值大的结点,返回小链表的头结点
        } else {
            bigLast.next = null;
        }

完整方法

private static Node separate(Node head, int x) {
        Node cur = head;
        Node small = null;
        Node smallLast = null;
        Node big = null;
        Node bigLast = null;

        while (cur != null) {
            if (cur.val < x) {
                // 把 cur 尾插到 small
                if (small == null) {
                    small = cur;
                } else {
                    smallLast.next = cur;
                }
                smallLast = cur;
            } else {
                // 把 cur 尾插到 big
                if (big == null) {
                    big = cur;
                } else {
                    bigLast.next = cur;
                }
                bigLast = cur;
            }
            cur = cur.next;
        }

        // 把 big 接到 small 的后边
        if (smallLast == null) {
            return big;
        } else {
            smallLast.next = big;
        }

        if (bigLast == null) {
            return small;
        } else {
            bigLast.next = null;
        }

        return small;
    }

总结 :Note

TIPS:how to 理解(recite)代码

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值