前言
V2EX上有人问多少人可以在一小时内做出来,面试题插入排序单链表
题目:让你用你熟悉的语言写一个插入排序单链表的算法题,你可以在一小时内写出来吗,并配上单元测试,同时编译通过
单元测试 1: Input: 4->2->1->3 Output: 1->2->3->4
单元测试 2: Input: -1->5->3->4->0 Output: -1->0->3->4->5
迫于闲着,试试用java写一下
代码
package demo;
class Node {
public Node next;
public int data;
public Node() {
}
public Node(Node next, int data) {
this.next = next;
this.data = data;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
Node p = this;
while(p!=null) {
sb.append(p.data+"->");
p=p.next;
}
String string = sb.toString();
return string.substring(0,string.length()-2);
}
}
public class Demo {
public static void main(String[] args) {
test1();
test2();
}
private static void test2() {
Node head = new Node(new Node(new Node(new Node(null, 3), 1), 2), 4);
Node sorted = sort(head);
System.out.println(sorted);
}
private static void test1() {
Node head = new Node(new Node(new Node(new Node(new Node(null,0), 4), 3), 5), -1);
Node sorted = sort(head);
System.out.println(sorted);
}
private static Node sort(Node head) {
Node sortedL, sortedR;
sortedL = head;
sortedR = head;
Node current = head;
while (sortedR.next != null) {
current = sortedR.next;
if (current.data < sortedL.data) {
sortedR.next = current.next;
current.next = sortedL;
sortedL = current;
} else if (sortedL.data <= current.data && current.data < sortedR.data) {
Node p = sortedL;
while (p != sortedR) {
if (p.data <= current.data && current.data < p.next.data) {
sortedR.next = current.next;
current.next = p.next;
p.next = current;
break;
}
p = p.next;
}
} else {
sortedR = current;
}
}
return sortedL;
}
}