【问题标题】:Splitting Singly Linked List拆分单链表
【发布时间】:2015-06-02 13:36:40
【问题描述】:

我正在尝试将一个单链表拆分为 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);
}

【问题讨论】:

  • 你怎么知道你的代码有问题?
  • 你有什么理由不使用std::list&lt;int&gt;
  • 最后 40% 发生了什么?
  • @erip 他们是“不关心”的成员。

标签: c++ linked-list singly-linked-list


【解决方案1】:

我用这段代码来测试你的功能:

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 而不会跳过原始链表中的任何节点。

【讨论】:

  • 很高兴为您提供帮助,欢迎来到 Stack Overflow。如果此答案或任何其他答案解决了您的问题,请将其标记为已接受。
猜你喜欢
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多