链表是否可以存储不同的数据类型?

时间:2014-03-22 17:53:57

标签: java memory-management data-structures types linked-list

我的问题非常笼统。我刚开始研究数据结构,我来自链接列表。我知道它们是一系列节点。每个节点都可以存储一些数据,它知道列表中的下一个节点。

因此,一个节点有一个对象O和一个指向下一个对象的指针,该对象称为对象B,后者又有另一个指针..直到我们到达一个指针为null的节点。

但是我说我将整数存储在链接列表中的一个节点中,该链接列表指向另一个持有字符串的节点。首先,它是允许的吗?第二,这将如何有用?

此外,在链表上执行的最常见操作是什么? getSize()remove()insert()getElement()concatenate()

如果我要存储一百万个手机号码,使用链接列表会有效吗?如果不是,那么链接列表的最佳使用将出现在哪里?

由于LinkedList随机存储在内存中(使用从一个节点到另一个节点的指针)而不是相邻的数组,这会使像C++/C这样的非自动垃圾收集语言变得更难内存分配和释放?

2 个答案:

答案 0 :(得分:5)

  

但是我说我将整数存储在链接列表中的一个节点中,该链接列表指向另一个持有字符串的节点。首先,它是允许的吗?第二,这将如何有用?

是的,只要列表声明为List<Object>List<Serializable>,它就被允许,String和Integer都扩展/实现。

在这种特殊情况下,它不会非常有用。但考虑List<Vehicle>。它可以存储汽车,自行车,卡车或任何其他类型车辆的实例。

  

在链表上进行的最常见操作是什么?

the javadoc中记录的内容。我会说添加和迭代可能是最常见的。但我还没有进行任何统计测量。

  

如果我要存储一百万个手机号码,使用链接列表是否有效?

这取决于您需要在列表中执行的操作。如果你只需要在开头或结尾添加,它将是O(1)。迭代不是问题。找到手机的索引将是O(n)。在列表中的给定索引处访问也将是O(n)。

通常,对于几乎每个用例,ArrayList比LinkedList快得多。 LinkedList更快的唯一用例是它总是在biginning处插入,或者在使用其迭代器迭代时删除/插入元素。

  

在内存分配和释放方面,这会使C ++ / C等非自动垃圾收集语言变得更难吗?

我没有足够的经验来回答这些语言,但是,既然你必须管理记忆,那就更难了。

答案 1 :(得分:0)

是的,请确保根据问题的标题,答案非常简单。 您可以在我设计的链表中插入任何数据类型值,并且这样做非常简单,我使用过不同的node和boolean变量的构造函数来检查插入的类型值,然后根据该值在我的程序中。

//IMPLEMENTATION OF SINGLY LINKED LISTS
#include"iostream"
#include"conio.h"
#include <typeinfo>
using namespace  std;



class node //struct
{
public:
    node* nextptr;
    int data;
    ////////////////////////////////just to asure that user can insert any data type value in the linked list
    string ss;
    char cc;
    double dd;
    bool stringTrue=0;
    bool intTrue = 0;
    bool charTrue = 0;
    bool doubleTrue = 0;
    ////////////////////////////////just to asure that user can insert any data type value in the linked list
    node()
    {
        nextptr = NULL;
    }
    node(int d)
    {
        data = d;
        nextptr = NULL;
        intTrue = 1;
    }
    ////////////////////////////////just to asure that user can insert any data type value in the linked list
    node(string s)
    {
        stringTrue = 1;
        ss = s;
        nextptr = NULL;
    }
    node(char c)
    {
        charTrue = 1;
        cc = c;
        nextptr = NULL;
    }
    node(double d)
    {
        doubleTrue = 1;
        dd = d;
        nextptr = NULL;
    }
    ////////////////////////////////just to asure that user can insert any data type value in the linked list
    //TO Get the data
    int getintData()
    {
        return data;
    }
    string getstringData()
    {
        return ss;
    }
    double getdoubleData()
    {
        return dd;
    }
    char getcharData()
    {
        return cc;
    }
    //TO Set the data
    void setintData(int d)
    {
        data = d;
    }
    void setstringData(string s)
    {
        ss = s;
    }
    void setdoubleData(double d)
    {
        dd = d;
    }
    void setcharData(char c)
    {
        cc = c;
    }
    char checkWhichInput()
    {
        if (intTrue == 1)
        {
            return 'i';
        }
        else if (stringTrue == 1)
        {
            return 's';
        }
        else if (doubleTrue == 1)
        {
            return 'd';
        }
        else if (charTrue == 1)
        {
            return 'c';
        }
    }
    //////////////////////////////Just for the sake of implementing for any data type//////////////////////////////
    node* getNextptr()
    {
        return nextptr;
    }
    void setnextptr(node* nptr)
    {
        nextptr = nptr;
    }
};


class linkedlist
{
    node* headptr;
    node* addnodeatspecificpoition;
    
public:
    linkedlist()
    {
        headptr = NULL;
    }
    void insertionAtTail(node* n)
    {
        if (headptr == NULL)
        {
            headptr = n;
        }
        else
        {
            node* rptr = headptr;
            while (rptr->getNextptr() != NULL)
            {
                rptr = rptr->getNextptr();
            }
            rptr->setnextptr(n);
        }
    }

    void insertionAtHead(node *n)
    {
        node* tmp = n;
        tmp->setnextptr(headptr);
        headptr = tmp;
    }

    int sizeOfLinkedList()
    {
        int i = 1;
        node* ptr = headptr;
        while (ptr->getNextptr() != NULL)
        {
            ++i;
            ptr = ptr->getNextptr();
        }
        return i;
    }

    bool isListEmpty() {
        if (sizeOfLinkedList() <= 1)
        {
            return true;
        }
        else 
        {
            false;
        }
    }

    void insertionAtAnyPoint(node* n, int position)
    {
        if (position > sizeOfLinkedList() || position < 1) {
            cout << "\n\nInvalid insertion at index :" << position;
            cout <<".There is no index " << position << " in the linked list.ERROR.\n\n";
            return;
        }

        addnodeatspecificpoition = new node;
        addnodeatspecificpoition = n;
        addnodeatspecificpoition->setnextptr(NULL);

        

        if (headptr == NULL)
        {
            headptr = addnodeatspecificpoition;
        }
        else if (position == 0)
        {
            addnodeatspecificpoition->setnextptr(headptr);
            headptr = addnodeatspecificpoition;
        }
        else
        {
            node* current = headptr;
            int i = 1;
            for (i = 1; current != NULL; i++)
            {
                if (i == position)
                {
                    addnodeatspecificpoition->setnextptr(current->getNextptr());
                    current->setnextptr(addnodeatspecificpoition);
                    break;
                }
                current = current->getNextptr();
            }
        }
    }

 
    friend ostream& operator<<(ostream& output,const linkedlist& L)
    {
        char checkWhatInput;
        int i = 1;
        node* ptr = L.headptr;
        while (ptr->getNextptr() != NULL)
        {
            ++i;
            checkWhatInput = ptr->checkWhichInput();
            /// <summary>
            switch (checkWhatInput)
            {
            case 'i':output <<ptr->getintData()<<endl;
                break;
            case 's':output << ptr->getstringData()<<endl;
                break;
            case 'd':output << ptr->getdoubleData() << endl;
                break;
            case 'c':output << ptr->getcharData() << endl;
                break;
            default:
                break;
            }
            /// </summary>
            /// <param name="output"></param>
            /// <param name="L"></param>
            /// <returns></returns>
            
            ptr = ptr->getNextptr();
        }

        /// <summary>
        switch (checkWhatInput)
        {
        case 'i':output << ptr->getintData() << endl;
            break;
        case 's':output << ptr->getstringData() << endl;
            break;
        case 'd':output << ptr->getdoubleData() << endl;
            break;
        case 'c':output << ptr->getcharData() << endl;
            break;
        default:
            break;
        }
        /// </summary>
        /// <param name="output"></param>
        /// <param name="L"></param>
        /// <returns></returns>

        if (ptr->getNextptr() == NULL)
        {
            output << "\nNULL (There is no pointer left)\n";
        }
        return output;
    }
    ~linkedlist() {
        delete addnodeatspecificpoition;
    }
};



int main()
{

    linkedlist L1;


    //Insertion at tail
    L1.insertionAtTail(new node("dsaf"));
    L1.insertionAtTail(new node("sadf"));
    L1.insertionAtTail(new node("sfa"));
    L1.insertionAtTail(new node(12));
    L1.insertionAtTail(new node(67));
    L1.insertionAtTail(new node(23));
    L1.insertionAtTail(new node(45.677));
    L1.insertionAtTail(new node(12.43556));


    //Inserting a node at head
    L1.insertionAtHead(new node(1));
    //Inserting a node at any given point
    L1.insertionAtAnyPoint(new node(999), 3);

    cout << L1;

    cout << "\nThe size of linked list after insertion of elements is : " << L1.sizeOfLinkedList();    
}

输出为
1
dsaf
sadf
999
sfa
12
67
23
45.677
12.4356
那就是您可以用来创建链接列表而无需担心数据类型的