当前位置:   article > 正文

在一有序Linked List中插入一个node,保持有序_linkedlist有序插入

linkedlist有序插入

例如:给定Linked List 1 --> 3 --> 6 --> 9 --> 13 --> null (要插入int target 0 7 14,分别对应三种情况1.插在最头,2.插在中间,3.插在最后)

ListNode N = new ListNode(target)  // 首先创建一个要插入的node 

case 0 :给定的LinkedList 是null 

 return N;

case 1 : target比first node还要小

 N.next = head;

 return N;

case 2 : target插在中间

                ListNode cur = head; // cur从head开始移动,寻找要插入的位置

要插入的位置:移动cur直到  cur.value < target < cur.next.value

   //找到后插入target

    N.next = cur.next;  // step1  

    cur.next = N;         // step2   

    return head;

stop condition :cur.next.value > target

这里要注意step1和step2的顺序

如果 step1、step2反过来,如下

 cur.next = N;

 N.next = cur.next;// 上一步N已经链接在cur的下一个了,这一步相当于N.next = N;(把N指向自己)

case 3 : target 插在最后一个 (和case 2 同样操作,直到cur.next == null)

        N.next = cur.next;

        cur.next = N

stop condition : cur.next == null

所以case2.case3结合起来stop condition为(cur.next == null || cur.next.value > target)

所以循环条件为stop condition取反(cur.next != null && cur.next.value < target) 

  1. public ListNode insert(ListNode head,int target) {
  2. // 创建要插入的node
  3. ListNode N = new ListNode(target);
  4. // case 0
  5. if (head == null) {
  6. return N;
  7. }
  8. // case 1
  9. if (target < head.value) {
  10. N.next = head;
  11. return N;
  12. }
  13. // case 2 + case 3
  14. ListNode cur = head; // cur从head开始移动
  15. while (cur.next != null && cur.next.value < target) {
  16. cur = cur.next; // 满足循环,移动cur
  17. }
  18. //把N放到cur和cur.next中间
  19. N.next = cur.next; // 注意这一步和下一步顺序不能反过来
  20. cur.next = N;
  21. return head;
  22. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/1002310
推荐阅读
相关标签
  

闽ICP备14008679号