两种方法实现链表的节点操作排序
2014-04-21 15:21
417 查看
题目:
功能: 根据单向链表的节点值和排序标识进行升降排序,并返回排序后的链表头指针。
输入: ListNode* pListHead 单向链表
unsigned int uiSortFlag 0表示按升序,1表示按降序
输出: 无
返回: 排序成功返回链表头指针,异常或未进行排序返回空指针
说明:通过四个指针实现两个节点的交换,也即要保持该交换的节点的前后节点
源码如下:
功能: 根据单向链表的节点值和排序标识进行升降排序,并返回排序后的链表头指针。
输入: ListNode* pListHead 单向链表
unsigned int uiSortFlag 0表示按升序,1表示按降序
输出: 无
返回: 排序成功返回链表头指针,异常或未进行排序返回空指针
说明:通过四个指针实现两个节点的交换,也即要保持该交换的节点的前后节点
源码如下:
/* 功能: 根据单向链表的节点值和排序标识进行升降排序,并返回排序后的链表头指针。 输入: ListNode* pListHead 单向链表 unsigned int uiSortFlag 0表示按升序,1表示按降序 输出: 无 返回: 排序成功返回链表头指针,异常或未进行排序返回空指针 */ struct ListNode { int m_nKey; ListNode* m_pNext; }; ListNode* SortList(ListNode* pHead, unsigned int uiSortFlag) { /*需要四个节点*/ ListNode *p; /*要交换的节点之前的节点 */ ListNode *prep; /*要加换的第一个节点*/ ListNode *temp; /*要交换的第二个节点*/ ListNode *tail; /*第二个节点后的节点*/ ListNode *pTempNode; /*用于指向创建的头文件*/ ListNode pHeadNode; /*对于没有头结点的链表,需要自己创建一个头结点,方便后面的操作*/ pHeadNode.m_nKey = 0; pHeadNode.m_pNext = pHead; pTempNode = &pHeadNode; tail = (ListNode *)NULL; if (pHead == NULL)/ { return (ListNode *)NULL; } if (uiSortFlag != 0 && uiSortFlag != 1) { return (ListNode *)NULL; } // 算法的核心部分 switch(uiSortFlag) { case 0: /*关键处理部分*/ while( pTempNode->m_pNext != tail ) { prep = pTempNode; p = pTempNode->m_pNext; while( p->m_pNext != tail ) { if( p->m_nKey > p->m_pNext->m_nKey ) { temp = p->m_pNext; prep->m_pNext = p->m_pNext; p->m_pNext = p->m_pNext->m_pNext; prep->m_pNext->m_pNext = p; p = temp; } // 节点后移 p = p->m_pNext; prep = prep->m_pNext; } tail = p; }// 第一个while break; case 1: while( pTempNode->m_pNext != tail ) { prep = pTempNode; p = pTempNode->m_pNext; while( p->m_pNext != tail ) { if( p->m_nKey < p->m_pNext->m_nKey ) { temp = p->m_pNext; prep->m_pNext = p->m_pNext; p->m_pNext = p->m_pNext->m_pNext; prep->m_pNext->m_pNext = p; p = temp; } // 节点后移 p = p->m_pNext; prep = prep->m_pNext; } tail = p; }// 第一个while break; default: return (ListNode *)NULL; } return pHeadNode.m_pNext; } int mian(int argc, char* argv[]) { ListNode astListNode[6]; ListNode *pListHead; ListNode *pListNext; astListNode[0].m_nKey = 1; astListNode[0].m_pNext = &astListNode[1]; astListNode[1].m_nKey = 3; astListNode[1].m_pNext = &astListNode[2]; astListNode[2].m_nKey = 2; astListNode[2].m_pNext = &astListNode[3]; astListNode[3].m_nKey = 1; astListNode[3].m_pNext = &astListNode[4]; astListNode[4].m_nKey = 5; astListNode[4].m_pNext = &astListNode[5]; astListNode[5].m_nKey = 4; astListNode[5].m_pNext = NULL; pListHead = SortList(astListNode, 1); return 0; }
相关文章推荐
- 两种方法实现:输入一个链表,从尾到头打印链表每个节点的值
- 两种方法实现:输入一个链表,从尾到头打印链表每个节点的值
- java 移动节点,排序号进行重新排序,以闭包形式实现ztree增删改查操作,其中排序运用到此方法
- 链表去重操作-两种方法的实现
- [Java]Java实现线程操作的两种方法
- 链表插入、链表相加、链表相乘、链表排序、链表合并等操作的java实现
- 快速排序的两种实现方法
- python实现单链表中删除倒数第K个节点的方法
- C语言实现双向链表删除节点、插入节点、双向输出等操作
- PHP带节点操作的无限分类实现方法详解
- 实现一个简单的 成绩排序(两种方法)
- C++实现单链表按k值重新排序的方法
- Java判断链表是否有环的两种实现方法
- 带头节点的单链表及其基本操作(Java实现)
- 两种方法实现从尾到头打印链表--栈和递归
- 编码实现环状单向链表(尾指针直接指向头指针,中间没有空节点),去除连续的重复元素的操作
- 用C++类实现单向链表的增删查和反转操作方法
- 链表及其各种函数操作的实现方法
- 链表的各种操作实现 链表逆序 链表排序 有序链表归并 链表存在环的判定
- 两种方法实现队满和队空的判断操作(循环队列)