面试题 - 无序单链表,排序

有一个单链表,无序,给定一个值,将链表中小于这个值的节点放置于链表前面,节点之间相对顺序不变。

这个题目我是这样想的,我们遍历单链表,当遇到大于指定指的节点群后,再其后面查找小于指定值的节点群,然后交换两个节点群的位置。

思路有了,大致的代码:

function LinkNode(data){
	this.data = data;
	this.next = null;
}

function LinkList(data){
	this.head = new LinkNode(data);
}
LinkList.prototype = {
	insert: function(data){
		var n = new LinkNode(data);
		var cur = this.head;
		while(cur.next != null){
			cur = cur.next;
		}
		cur.next = n;
	},
	toString: function(){
		var ret = [];
		var cur = this.head;
		while(cur != null){
			ret.push(cur.data);
			cur = cur.next;
		}
		return "LinkList: " + ret.join(" -> ");
	}
}

function test(list, v){
	var n1,n2,n3,n4,n5,cur;
	cur=list.head;
	while(cur != null){
		if(cur.data>=v){
			n2 = cur;
			n3 = cur;
			while(n3.next != null && n3.next.data >= v){
				n3 = n3.next;
			}
			n4 = n3.next;
			n5 = n3.next;
			while(n5!=null && n5.next != null && n5.next.data < v){
				n5 = n5.next;
			}
			if(n4 == null){
				return;
			}
			//
			if(n1 == null){
				list.head = n4;
			}else{
				n1.next = n4;
			}
			var c = n5.next;
			n5.next = n2;
			n3.next = c;
			cur = n4;
		}
		n1 = cur;
		cur = cur.next;
	}
}
var a = new LinkList(3);
a.insert(8);
a.insert(7);
a.insert(6);
a.insert(5);
a.insert(4);
a.insert(9);
a.insert(3);
a.insert(2);
a.insert(7);
a.insert(1);
console.log(a.toString());
test(a, 5);
console.log(a.toString());

运行效果:

我上面的代码简化一个地方,将等于value的节点也规划成大于value的节前群中,这样单链表中只会存在两种类型的节点,大于和小于,因此上面代码中,n3之后肯定是n4,如果需要将等于独立出来,那么我们就再需要两个变量来记录等于value的节点群。

时间: 2024-10-12 20:50:17

面试题 - 无序单链表,排序的相关文章

栈和队列----删除无序单链表中值重复出现的节点

删除无序单链表中值重复出现的节点 给定一个无序单链表的头节点head,删除其中值重复的节点 例如: 1->2->3->3->4->4->2->1->1->null 删除之后变为 1->2->3->4->null 方法1:如果链表长度为N,时间复杂度达到O(N) 方法2:如果要求空间复杂度为O(1),应该怎样实现 [解析] 方法1:利用哈希表去实现 使用哈希表,因为头节点是不用删除的节点,所以首先将头节点放入到哈希表中,然后从下一

148. Sort List (java 给单链表排序)

题目:Sort a linked list in O(n log n) time using constant space complexity. 分析:给单链表排序,要求时间复杂度是O(nlogn),空间复杂度是O(1).时间复杂度为O(nlogn)的排序算法有快速排序和归并排序, 但是,对于单链表来说,进行元素之间的交换比较复杂,但是连接两个有序链表相对简单,因此这里采用归并排序的思路. 编码: public ListNode sortList(ListNode head) { if(hea

笔试,面试,C/C++,数据结构单链表排序(改进冒泡排序)

void BubbleSortNode(SListNode *&pHead)//单链表排序 {  assert(pHead);  SListNode *tail = NULL;  int Bool = 0;  //若没有进行交换提前返回  while (tail!=pHead->next)  {   Bool = 0;   SListNode *tmp = pHead;   SListNode *tmpnext = tmp->next;   while (tmp->next !=

将单链表排序的两种方法

对单链表排序,通常有两种方法.(PS:考察一个程序员的C语言编程功底,通常看他是否能娴熟的操作链表就知道了.) 方法1:将每一个结点保存到额外的数组中,对数组进行排序,然后根据有序的数组重新构建链表. 方法2:直接对链表进行插入排序,但是实现起来比较复杂一些. 显然,方法1最为简单,因为将链式存储L先转化为顺序存储a[],对顺序存储a[]排序,就避免了较为复杂的链接指针操作.一旦对顺序存储a[]排好序后,根据a[]重新构建一个链表是易如反掌的事情. 1. 单链表的定义如下 typedef str

12.单链表排序

12.单链表排序 思路: 参见基本函数13://冒泡排序链表,具体的做法是“狸猫换太子”,即只交换节点中的值,对链表结构不做改动. void sortList(Node*& Head); //链表排序 //排序的方法是不破坏结构,有“狸猫换太子”的意思,只进行value的交换,不破坏链表结构 void sortList(Node*& Head) {   int count=numOfNodes(Head);   if(count==0||count==1)   {    return ;

单链表排序(插入与归并)

struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; /* * 单链表的插入排序, 插入排序是一种稳定排序 */ class Solution7 { public: ListNode* insertionSortList(ListNode* head) { if(head == NULL || head->next == NULL) return head; ListNode *

奇数结点升序偶数结点降序的单链表排序(Python实现)

题目 一个链表,奇数结点升序,偶数结点降序,要求变成一个全升序的链表. 例如:1->8->2->7->3->6->4->5,变为1->2->3->4->5->6->7->8 解析 按照以下步骤处理: 按照奇偶位拆分为两个链表 反转偶数结点构成的链表 合并两个递增链表 Python实现 # -*- coding:utf-8 -*- class Node(object): def __init__(self, val=None

单链表排序——快速排序实现

利用快速排序,同向一前一后两个指针 #ifndef LIST_H_ #define LIST_H_ #include <iostream> #include <utility> class List { private: struct ListNode { int _value; ListNode* _next; }; public: List(): _head(nullptr) {} ~List() { while (nullptr != _head) { auto tmp =

单链表排序--归并排序

#include <iostream> #include <cstdlib> using namespace std; struct ListNode //默认为public { int data; ListNode* next; ListNode(int x, ListNode* nextNode):data(x), next(nextNode){} }; ListNode* mergeData(ListNode* first, ListNode* second) { if(fi