从链接列表中删除重复项

时间:2013-10-14 17:48:32

标签: c

尝试了链接列表问题1.来自cpp中的Cracking the coding interview。 - 编写代码以从未排序的链表中删除重复项。 跟进 如果不允许临时缓冲区,您将如何解决此问题?

您如何看待此实施。

#include "stdafx.h"
#include <stdlib.h>
struct node
{
    int data;
    struct node *next;
};
struct node *head = (node*)malloc(sizeof(node));
struct node *tail = (node*)malloc(sizeof(node));

struct node* createNode(int data)
{
    struct node *newNode = (node*)malloc(sizeof(node));
    newNode->data = data;
    newNode->next = NULL;
    head = newNode;
    return newNode;
}

bool insertAfter(node * list, int data)
{
    //case 1 - insert after head
    struct node *newNode = (node*)malloc(sizeof(node));
    if (!list)
    {

        newNode->data = data;
        newNode->next = head;
        head = newNode;
        return true;
    }

    struct node * curpos = (node *)malloc(sizeof(node));
    curpos = head;
    //case 2- middle, tail of list
    while (curpos)
    {
        if (curpos == list)
        {
            newNode->data = data;
            if (curpos->next == NULL)
            {
                newNode->next = NULL;
                tail = newNode;
            }
            else
            {
                newNode->next = curpos->next;
            }
            curpos->next = newNode;
            return true;
        }
        curpos = curpos->next;
    }
}

void deleteNode(node *runner, node * curr){

    //DELETE AT TAIL
    if (runner->next->next == NULL)
    {
        runner->next = NULL;        
    }
    else//delete at middle
    {
        runner->next = runner->next->next;
    }
}


void removedups(node * list)
{
    struct node * curr = (node*)malloc(sizeof(node));
    struct node * runner = (node*)malloc(sizeof(node));
    curr = head;
    runner = curr;
    while (curr != NULL){
        runner = curr;
        while (runner->next != NULL){
            if (curr->data == runner->next->data){
                deleteNode(runner, curr);
            }
            if (runner->next!=NULL)
                runner = runner->next;
        }
        curr = curr->next;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    struct node * list = (node*) malloc(sizeof(node));
    list = createNode(1);
    insertAfter(list,2);
    insertAfter(list, 2);
    insertAfter(list, 3);   
    removedups(list);
    return 0;
}

1 个答案:

答案 0 :(得分:2)

它看起来更像是C代码,而不是C ++。

如果是面试,尝试使用递归,他们主要询问链表问题,看看你是否对此感到满意。只是为了测试你是否善于使用不同类型的算法。

你有很多malloc(动态内存分配的C风格),但你在哪里释放内存? 内存泄漏也是他们想要听到你想到的东西! 所以不要犹豫大声说出来:现在我必须检查一下我是不是在弄乱记忆!