c++中对单链表操作---合并两个链表
题目很简单:
输入两个链表(不一定有序),合并这两个链表并使新链表中的结点是按照递增排序。
其他不多说,看一下代码:
/* author:http://blog.csdn.net/richerg85 */ #include "stdafx.h" #include <iostream> using namespace std; struct ListNode { int m_nValue; ListNode *m_pNext; }; ListNode *MergeTwoList(ListNode *pFirstNodeHead, ListNode *pSecondNodeHead) { if ( pFirstNodeHead == NULL ) return pSecondNodeHead; if ( pSecondNodeHead == NULL ) return pFirstNodeHead; //normal merge ListNode *pFirstNode = pFirstNodeHead; ListNode *pSecondNode = pSecondNodeHead; ListNode *pMergeHead = NULL; ListNode *pCurNode = NULL; if ( pFirstNode->m_nValue < pSecondNode->m_nValue) { pMergeHead = pFirstNodeHead; pFirstNode = pFirstNode->m_pNext; pCurNode = pMergeHead; } else { pMergeHead = pSecondNodeHead; pSecondNode = pSecondNode->m_pNext; pCurNode = pMergeHead; } while ( pFirstNode!=NULL && pSecondNode != NULL ) { if ( pFirstNode->m_nValue < pSecondNode->m_nValue) { pCurNode->m_pNext = pFirstNode; pCurNode = pFirstNode; pFirstNode = pFirstNode->m_pNext; } else { pCurNode->m_pNext = pSecondNode; pCurNode = pSecondNode; pSecondNode = pSecondNode->m_pNext; } if ( pFirstNode == NULL ) pCurNode->m_pNext = pSecondNode; if ( pSecondNode == NULL ) pCurNode->m_pNext = pFirstNode; } return pMergeHead; } int GetNodeLen(ListNode *pHead) { if ( !pHead ) return 0; ListNode *pCur =pHead; int nCnt = 0; while ( pCur ) { nCnt++; pCur = pCur->m_pNext; } return nCnt; } //bubble sort void SortNode(ListNode *&pHead) { ListNode *p1 = NULL; ListNode *p2 = NULL; if ( !pHead ) return; int nCnt = GetNodeLen(pHead); for (int i=0; i<nCnt-1; i++) { p1 = pHead; for (int j=0; j<nCnt-i-1; j++) { p2 = p1->m_pNext; if ( p1->m_nValue > p2->m_nValue ) { int k = p1->m_nValue; p1->m_nValue = p2->m_nValue; p2->m_nValue = k; } p1 = p1->m_pNext; } } } //insert node void InsertNode(ListNode *&pHead) { ListNode *pListNode = NULL; ListNode *pCurNode = NULL; if ( pHead == NULL ) { pHead = new ListNode(); cin >>pHead->m_nValue; if ( pHead->m_nValue == -1 )//-1,end { pHead = NULL; return; } pHead->m_pNext = NULL; pCurNode = pHead; } while(1) { pListNode = new ListNode(); cin >> pListNode->m_nValue; if ( pListNode->m_nValue == -1 ) break; pListNode->m_pNext = NULL; pCurNode->m_pNext = pListNode; pCurNode = pListNode; } } //print list void PrintList(ListNode *pHead) { if ( pHead ) { ListNode *pCur = pHead; while ( pCur ) { cout << pCur->m_nValue << " "; pCur = pCur->m_pNext; } cout << endl; } } int main() { ListNode *pFistNode = NULL; ListNode *pSecondNode = NULL; cout<<"Please input first link:(-1 end)"<<endl; InsertNode(pFistNode); PrintList(pFistNode); cout<<"Please input second link:(-1 end)"<<endl; InsertNode(pSecondNode); PrintList(pSecondNode); cout<<"sort first:"<<endl; SortNode(pFistNode); PrintList(pFistNode); cout<<"sort second:"<<endl; SortNode(pSecondNode); PrintList(pSecondNode); ListNode *pMergeNode = MergeTwoList(pFistNode, pSecondNode); cout<<"After merge:"<<endl; PrintList(pMergeNode); return 0; }
运行:
补充:
单链表逆转
void ReverseList(ListNode *&pHead) { if ( !pHead ) return; ListNode *pPre,*pCur,*pNext; pPre = pHead; pCur = pPre->m_pNext; while ( pCur ) { pNext = pCur->m_pNext; pCur->m_pNext = pPre; pPre = pCur; pCur = pNext; } pHead->m_pNext = NULL; pHead = pPre; }
说明:*&,为指针的引用
删除一个单向链表的最中间元素,不能使用两次循环(申请两个指针,步长不一样)。
void delMiddle(link *head) { if(head == NULL) return; else if(head->next == NULL) { delete head; return; } else { link *low = head; link *fast = head->next; while(fast != NULL && fast->next != NULL) { fast = fast->next->next; if(fast == NULL) break; low = low->next; } link *temp = low->next; low->next = low->next->next; delete temp; } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。