剑指 Offer II 029. 排序的循环链表

做题记录:
提交了若干次才成功的一道题。

  1. 如果链表是空链表,直接构造一个节点,指向自己,返回即可。
  2. 如果链表非空,有可能是递增,也有可能链表中所有的值相等
  3. 如果链表是递增的,值可能介于最大和最小值中间,也有可能小于最小值,也有可能大于最大值
    3.1 如果插入值介于最大和最小值中间,那么这种情况直接找>=前面的元素值并且<=后面的元素值的位置即可
    3.2 如果插入值小于最小值或者大于最大值,那么需要找到最小值和最大值的位置,并且把插入值插入这两个位置之间即可
  4. 假如链表中所有的值相等,如果插入值等于链表中的元素值,那么遍历第一个元素的时候就可以插入;如果插入值大于或者小于链表中的元素值,那么会一直遍历所有的元素,才能确定插入的位置。
    附上代码:
public static Node insert(Node head, int insertVal) {
    if (head == null) {
        head = new Node(insertVal);
        head.next = head;
        return head;
    }
    Node cur = head, next = cur.next;
    while (cur.next != null) {
        next = cur.next;
        if (cur.val <= insertVal && insertVal <= next.val) {
            break;
        }
        if (cur.val > next.val) {
            if (insertVal >= cur.val || insertVal <= next.val) {
                break;
            }
        }
        if (cur.next == head) {
            break;
        }
        cur = cur.next;
    }
    Node node = new Node(insertVal);
    cur.next = node;
    node.next = next;
    return head;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值