[英]Splitting Singly Linked List
我正在嘗試將單鏈接列表拆分為2個單鏈接列表。 l1將獲得l的30%成員,l2將獲得l的下一個30%。
#include <iostream>
using namespace std;
struct Node{
int data;
Node* pNext;
};
struct List{
Node* pHead, *pTail;
};
void CreateList(List &l){
l.pHead=l.pTail=NULL;
}
int Count(List l){
int i=0;
Node*p=l.pHead;
while (p){
i++;
p=p->pNext;
}
return i;
}
void RemoveList(List &l){
Node *p;
while (l.pHead){
p=l.pHead;
l.pHead=p->pNext;
delete p;
}
}
void Patition(List &l, List &l1, List &l2){
int t=Count(l)*0.3;
cout<<"t="<<t<<endl;
CreateList(l1);
CreateList(l2);
Node *p=l.pHead;
l1.pHead=p;
for (int i=0;i<t;i++)
p=p->pNext;
l1.pTail=p;
l.pHead=p->pNext;
p=l.pHead;
l2.pHead=p;
for (int i=0;i<t;i++)
p=p->pNext;
l2.pTail=p;
l.pHead=p->pNext;
RemoveList(l);
}
我使用以下代碼來測試您的功能:
int _tmain(int argc, _TCHAR* argv[])
{
List l;
CreateList(l);
l.pHead = new Node;
l.pHead->pNext = l.pTail;
Node *iterator = l.pHead;
// Initial linked list
for (int i = 0; i < 10; i++) {
Node *newNode = new Node;
newNode->pNext = iterator->pNext;
iterator->data = i;
iterator->pNext = newNode;
iterator = newNode;
}
List l1, l2;
Patition(l, l1, l2);
cout << Count(l);
cout << Count(l1);
cout << Count(l2);
return 0;
}
我發現,在您的Count函數中,結束條件是p
為NULL時,但是在分區函數中,您沒有使鏈表的末尾指向NULL進行更新。
我將如何糾正這一問題,只需將分區功能修改為
void Patition(List &l, List &l1, List &l2){
int t = Count(l)*0.3;
cout << "t=" << t << endl;
CreateList(l1);
CreateList(l2);
Node *p = l.pHead;
l1.pHead = p;
for (int i = 0; i<t; i++)
p = p->pNext;
// Change
l.pHead = p->pNext;
p->pNext = l1.pTail;
//
p = l.pHead;
l2.pHead = p;
for (int i = 0; i<t; i++)
p = p->pNext;
// Change
l.pHead = p->pNext;
p->pNext = l2.pTail;
//
RemoveList(l);
}
這將使每個鏈接列表的尾部始終指向pTail,而不會從原始鏈接列表中跳過任何節點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.