您的位置:首页 > 其它

leetcode之Insertion Sort List

2014-04-19 14:52 281 查看
Insertion Sort List ,即用插入的方法排序链表。

主要思想:先从原始链表list摘掉一个节点,然后判断这个节点应该插入在sortedList的表头,中间,还是表尾。循环此步骤,直到原始链表为空。

源代码如下:

import java.util.Random;

public class InsertionSortLinkedList {
public ListNode insertionSortList(ListNode head)
{
if(head == null || head.next == null)
return head;
ListNode sortedHead = head; //用p指向有序链表的第一个节点

head = head.next;
sortedHead.next = null;
ListNode currentNode = null;  //当前待插入的节点
ListNode sortedNode = sortedHead; //游走在有序链表的指针
ListNode preSortedNode = sortedNode; //sortedNode的前驱
while(head != null)
{
currentNode = head;
head = head.next;
currentNode.next = null;  //把当前节点从原始链表中摘出来
while(sortedNode != null && currentNode != null)
{
if(sortedHead.val >= currentNode.val) //如果插入点在链表的开始处
{
currentNode.next = sortedHead;
sortedHead = currentNode;
//					currentNode = null;
break;
}
else if(sortedNode.val < currentNode.val)
{
preSortedNode = sortedNode;
sortedNode = sortedNode.next;
}else{
currentNode.next = preSortedNode.next;
preSortedNode.next = currentNode;
break;
//					currentNode = null;
}
}
if(sortedNode == null)  //插入点在链表表尾
{
preSortedNode.next = currentNode;
}
sortedNode = sortedHead;
currentNode = null;
}
return sortedHead;
}

public static void main(String[] args)
{
Random rand = new Random();
ListNode head = null;
ListNode currentNode = null;
for(int i = 0 ; i < 10; i ++)
{
if(head == null)
{
head = new ListNode(rand.nextInt(47));
currentNode = head;
}else{
currentNode.next = new ListNode(rand.nextInt(47));
currentNode = currentNode.next;
}
}
//		System.out.println("ok!");
InsertionSortLinkedList isll = new InsertionSortLinkedList();
ListNode result = isll.insertionSortList(head);
while(result != null)
{
System.out.print(result.val + " ");
result = result.next;
}
//		System.out.println("ok!");
}
}

//class ListNode {
//    int val;
//    ListNode next;
//    ListNode(int x) {
//        val = x;
//        next = null;
//   }
//}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: