删除链表中的重复

时间:2016-09-18 19:41:34

标签: c++ linked-list

我有一个函数,它接受一个项链表,并从列表中删除所有重复项。出于某种原因,当我在函数中运行链表时,它只删除其中一个重复项。

这是我的代码:

#include "node1.h";
#include <iostream>

using namespace std;
using namespace main_savitch_5;

void noRepeat(node* head_ptr){
    for (node* i = head_ptr; i != NULL; i = i->link()){
        for (node* j = i->link(); j != NULL; j = j->link()){

            if (i->data() == j->data()){
                list_remove(j);
            }
        }
    }
}

void list_print(node * head_ptr){
    //Start at the head pointer and loop through the linked list
    for (node* i = head_ptr; i != NULL; i = i->link()){
        //Print out current element
        cout<<i->data()<<" ";
    }
    //New line
    cout<<""<<endl;
}

int main(){
    node* one = new node(5);
    node* two = new node(3, one);
    node* three = new node(5, two);
    node* four = new node(6, three);
    node* five = new node(3, four);
    noRepeat(five);
    list_print(five);
}

已实施的功能:

//Receives current node data
value_type data() const { return data_field; }

//Receives link
node *link() { return link_field; }

列表删除功能

void list_remove(node *previous_ptr) {
        node *remove_ptr;

        remove_ptr = previous_ptr->link();
        previous_ptr->set_link(remove_ptr->link());
        delete remove_ptr;
    }

当我第一次运行我的代码时,noRepeat函数接受头指针,即5,并尝试删除所有重复项。之后,列表打印出来。打印出来的清单是:3 6 5 3但它应该是3 6 5,为什么5被删除但三者不是?

1 个答案:

答案 0 :(得分:1)

在内循环中

    for (node* j = i->link(); j != NULL; j = j->link()){

        if (i->data() == j->data()){
            list_remove(j);
        }

您正在使用节点list_remove调用函数j,这意味着这是您要删除的节点(至少根据双循环的逻辑)。

但是,该函数实际上将前面的节点带到要删除的节点,并删除 next 节点。除了函数中的逻辑外,您还可以在

中看到它
void list_remove(node *previous_ptr) {

在您的示例中,3的下一个节点为null,因此实际上没有删除任何内容。