Insert SortList

来源:互联网 发布:黑暗之魂2原罪学者优化 编辑:程序博客网 时间:2024/06/05 11:14
 public ListNode insertionSortList(ListNode head) {          if(head==null||head.next==null) {              return head;          }                ListNode dummy = new ListNode(-1);          dummy.next = null;          ListNode new_next;          ListNode pre,next;          while(head!=null) {              next = head.next;              pre  = searchForInsertPos(dummy,head.val);              new_next = pre.next;              head.next = new_next;              pre.next  = head;  //插入动作            head = next;          }          return dummy.next;      }  }  
ListNode searchForInsertPos(ListNode head, int val) {          ListNode pre  = head;          ListNode next = head.next;          while(next!=null&&next.val<=val) {              pre  = next;              next = next.next;          }          return pre;      }  



基本分析:用插入排序对一个链表进行排序。
一开始写的时候想套用数组的插入排序,结果发现无法对末节点加上NULL。
对链表进行插入排序的正确方法是:新建一个头节点,遍历原来的链表,对原链表的每个节点找到新链表中适合插入位置的前指针,然后执行插入操作。

这种操作链表的题有一个技巧就是新建一个dummy作为head,然后把数据插入到dummy的链表中,最后返回dummy.next。

第二种方法:

public ListNode insertionSortList(ListNode head) {if(head == null)return null;ListNode helper = new ListNode(0);ListNode pre = helper;ListNode cur = head;while(cur!=null){ListNode next = cur.next;pre = helper;//helper头节点并不参与比较while(pre.next!=null && pre.next.val<cur.val){pre = pre.next;}cur.next = pre.next;pre.next = cur;cur = next;}return helper.next;}

0 0
原创粉丝点击