做LeetCode时遇到的一个小问题,总结一下。
链表定义为如下
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
要求用插入排序对其进行排序,并返回第一个节点。
解决方案的代码如下:
public class Solution {
public ListNode insertionSortList(ListNode head) {
//处理特殊情况
if(head == null) {
return head;
}
//定义helper节点,在下面它会被插到链表的开头,作为链表新的开头,可以方便的使用
ListNode helper = new ListNode(0);
//1.因为是单向的链表,所以插入项的前一项要被记录2.用它来遍历已经排序的项依次与插入项比较,得到插入位置
ListNode pre = helper;
//定义插入节点,开始时为head
ListNode ins = head;
//定义一个next节点来在循环中保存插入项的下一个节点
ListNode next = null;
while(ins != null) {
next = ins.next;
//此循环第一次循环时把helper加到链表前面,后续的循环,把每个插入项插到正确的位置
while(pre.next != null && pre.next.val < ins.val) {
pre = pre.next;
}
ins.next = pre.next;
pre.next = ins;
pre = helper;
ins = next;
}
return helper.next;
}
}