您的位置:首页 > 职场人生

华为面试 循环链表 排序

2013-05-07 20:44 127 查看
给出一个循环链表,要输出排序后的链表。

直接用调整节点的方式的话,复杂度太高了,但是有人提出复制到数组中,排序后再复制回去,这样时间复杂度和空间复杂度都提高了。因此这里每个节点的指针不调整,仅仅调整节点里的值。排序咱就不用高端的算法了,就用冒泡排序。每次把最大值移到最后。

代码如下:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  循环链表 排序 面试
相关文章推荐