华为面试 循环链表 排序
2013-05-07 20:44
127 查看
给出一个循环链表,要输出排序后的链表。
直接用调整节点的方式的话,复杂度太高了,但是有人提出复制到数组中,排序后再复制回去,这样时间复杂度和空间复杂度都提高了。因此这里每个节点的指针不调整,仅仅调整节点里的值。排序咱就不用高端的算法了,就用冒泡排序。每次把最大值移到最后。
代码如下:
2,直接进行链表指针操作,来进行排序。这时候我加了一个头结点,其值为最小的int值,该节点作为哨兵节点,可以简化操作。代码如下:
#include "stdafx.h"
#include <iostream>
using namespace std;
struct Node{
int data;
Node *next;
};
int main()
{
//**********************构造循环链表 数据依次是 2 3 1 0 **********
Node a1;
Node *head = &a1;
a1.data = 2;
Node a2;
a1.next = &a2;
a2.data = 3;
Node a3;
a2.next = &a3;
a3.data = 1;
Node a4;
a3.next = &a4;
a4.data = 0;
a4.next = head;
//************************** 循环链表构造结束 *******************************
Node nodeflag;
nodeflag.data = INT_MIN;
nodeflag.next = head;
//找到尾节点,将后继设为NULL
Node *pEnd = head;
while ( pEnd ->next != head )
pEnd = pEnd ->next;
pEnd->next = NULL;
for( Node *pOut = head ->next; pOut != NULL; pOut = pOut->next )
{
int t_nIndex = pOut->data;
Node *pChange = NULL; //要交换到这个指针的后面
Node *pPre = NULL; //该节点的前驱指针
for ( Node *pInner = &nodeflag; pInner != pOut; pInner = pInner ->next )
{
pPre = pInner;
if ( pInner ->data < t_nIndex && pInner ->next ->data >t_nIndex )
pChange = pInner;
}
//这时候有可以交换的节点
if ( pChange != NULL )
{
pPre -> next = pOut ->next;
pOut ->next = pChange ->next;
pChange ->next = pOut;
}
//如果是最后一个节点,这时候可以返回了,没有这句结果也正常,不过要多循环几次
if( pOut == pEnd ) break;
}
//输出排序后的结果
for( Node *pBeg = nodeflag.next ; pBeg != NULL; pBeg = pBeg->next)
{
cout<<pBeg->data<<endl;
}
return 0;
}
直接用调整节点的方式的话,复杂度太高了,但是有人提出复制到数组中,排序后再复制回去,这样时间复杂度和空间复杂度都提高了。因此这里每个节点的指针不调整,仅仅调整节点里的值。排序咱就不用高端的算法了,就用冒泡排序。每次把最大值移到最后。
代码如下:
#include "stdafx.h" #include <iostream> using namespace std; struct Node{ int data; Node *next; }; int main() { //**********************构造循环链表 数据依次是 3 1 4 2 ********** Node a1; Node *head = &a1; a1.data = 2; Node a2; a1.next = &a2; a2.data = 3; Node a3; a2.next = &a3; a3.data = 1; Node a4; a3.next = &a4; a4.data = 4; a4.next = head; //************************** 循环链表构造结束 ******************************* Node *pOut = head; //冒泡排序外层循环中的指针 //bool flag = true; while ( pOut->next != head ) { Node *pInner = head; //冒泡排序内层循环中的指针 while ( pInner -> next != head ) { if ( pInner->data > pInner ->next->data ) swap( pInner->data, pInner ->next->data ); pInner = pInner ->next; } pOut = pOut -> next; } cout<<a1.data<<endl; cout<<a2.data<<endl; cout<<a3.data<<endl; cout<<a4.data<<endl; return 0; }
2,直接进行链表指针操作,来进行排序。这时候我加了一个头结点,其值为最小的int值,该节点作为哨兵节点,可以简化操作。代码如下:
#include "stdafx.h"
#include <iostream>
using namespace std;
struct Node{
int data;
Node *next;
};
int main()
{
//**********************构造循环链表 数据依次是 2 3 1 0 **********
Node a1;
Node *head = &a1;
a1.data = 2;
Node a2;
a1.next = &a2;
a2.data = 3;
Node a3;
a2.next = &a3;
a3.data = 1;
Node a4;
a3.next = &a4;
a4.data = 0;
a4.next = head;
//************************** 循环链表构造结束 *******************************
Node nodeflag;
nodeflag.data = INT_MIN;
nodeflag.next = head;
//找到尾节点,将后继设为NULL
Node *pEnd = head;
while ( pEnd ->next != head )
pEnd = pEnd ->next;
pEnd->next = NULL;
for( Node *pOut = head ->next; pOut != NULL; pOut = pOut->next )
{
int t_nIndex = pOut->data;
Node *pChange = NULL; //要交换到这个指针的后面
Node *pPre = NULL; //该节点的前驱指针
for ( Node *pInner = &nodeflag; pInner != pOut; pInner = pInner ->next )
{
pPre = pInner;
if ( pInner ->data < t_nIndex && pInner ->next ->data >t_nIndex )
pChange = pInner;
}
//这时候有可以交换的节点
if ( pChange != NULL )
{
pPre -> next = pOut ->next;
pOut ->next = pChange ->next;
pChange ->next = pOut;
}
//如果是最后一个节点,这时候可以返回了,没有这句结果也正常,不过要多循环几次
if( pOut == pEnd ) break;
}
//输出排序后的结果
for( Node *pBeg = nodeflag.next ; pBeg != NULL; pBeg = pBeg->next)
{
cout<<pBeg->data<<endl;
}
return 0;
}
相关文章推荐
- 把二元查找树转变成排序的双向链表——精选微软经典的算法面试100题中第一题
- 面试___把二元查找树转变成排序的双向链表
- 在一个已排序的循环链表中插入节点
- 面试100题:1.把二元查找树转变成排序的双向链表
- 关于动态存储分配函数的调用,在已经过排序的数组中查找及删除内容的操作,余数的分析,删除字符数组中的空格,对链表的逆置,在源字符串中查找子字符串的个数,函数指针以及函数的调用,循环赋值带来的问题以及插入
- 双向循环链表的选择排序
- 【LeetCode-面试算法经典-Java实现】【082-Remove Duplicates from Sorted List II(排序链表中删除重复元素II)】
- 【面试题17】合并两个排序的链表
- 线性表的顺序表 实现,及应用-----西文排序+前m个元素和后n个元素进行整体互换+构造纯集合+有序表求纯集合+循环有序链表表示两集合的并集
- 微软面试(1/100)---把二元查找树转变成排序的双向链表
- 微软等数据结构+算法面试100题(43)-- 把二元查找树转变成排序的双向链表
- 【LeetCode-面试算法经典-Java实现】【083-Remove Duplicates from Sorted List(排序的单链表中删除重复的结点)】
- 程序员面试题目总结--链表(6)【单链表排序】
- 剑指offer面试17 合并两个排序的链表
- 面试金典--删除未排序链表重复节点
- 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】
- 面试算法(十六)合并两个排序的链表
- 顺序表、单链表、循环单链表、循环双链表、有序单链表的排序的实现
- 面试之路(29)-合并两个排序的链表(递归和非递归)
- 面试之路(29)-合并两个排序的链表(递归和非递归)