【问题标题】:Adding node to the front of a linked list将节点添加到链表的前面
【发布时间】:2013-10-05 05:08:35
【问题描述】:

我真的很困惑这里到底发生了什么......

我有这个功能

void addToFront(int data)  
{
  Node* tmp = new Node();
  tmp -> data = data;
  tmp -> next = head;
  head = tmp;
}

所以当我们执行tmp-> next = head 行时,我们让tmp 指针指向head 所指向的对象(列表的当前第一个元素)?因为这就是它的感觉,但这不是让它指向head吗?然后当我们执行head = tmp 时,我们将 head 指向我们创建的新节点,对吗?

【问题讨论】:

    标签: c++


    【解决方案1】:

    这就是你的列表的样子(假设)

     +----+-----+   +-----+-----+   +-----+------+
     |  A |     +-->|     |     +-->|     |      |
     +----+-----+   +-----+-----+   +-----+------+
     /
    

    Head 指向位置A

    你创建一个新节点

     +----+----+
     | B  |    |
     +----+----+
     /
    

    tmp 现在指向B。在tmp->data 中插入数据,然后生成tmp -> next = head;。所以现在我们有:

     +----+----+     +----+-----+   +-----+-----+   +-----+------+
     | B  |next|---->|  A |     +-->|     |     +-->|     |      |
     +----+----+     +----+-----+   +-----+-----+   +-----+------+
                      /
    

    然后你让head 指向B 而不是A

     +----+----+     +----+-----+   +-----+-----+   +-----+------+
     | B  |next|---->|  A |     +-->|     |     +-->|     |      |
     +----+----+     +----+-----+   +-----+-----+   +-----+------+
     /  \
    

    head & tmp 现在指向B

    【讨论】:

    【解决方案2】:

    所以当我们执行 tmp-> next =head 行时,我们是在让 tmp 指针指向 head 所指向的(列表的当前第一个元素)?因为这就是它的感觉,

    正确。

    但这不是让它指向头部吗?

    没有。要指向头,它需要包含头的地址。但是这一行使它包含了head的value。所以没有。

    然后当我们执行 head = tmp 时,我们将 head 指向我们创建的新节点,对吗?

    是的。

    【讨论】:

    • @so 那么既然指针的值是它所指向的东西的地址,那么 tmp 获取 head 的值就意味着它正在获取 head 指向的地址。
    • 没错。 tmp -> next = head;tmp -> nexthead 相同的值。因此tmp -> next 现在指向head 指向的任何东西。
    • 但是 head = tmp 是否意味着 head 现在指向任何 tmp 指向的东西? tmp 现在不是指向链表上以前的第一个节点吗?
    • @FrostyStraw 是的。这正是您想要将新节点放在单链表头部的内容。该节点指向前一个头。该节点是新的头。
    • 哦,我明白了。因为 tmp 指向创建的新节点,所以 head 现在具有 tmp 指向的值,因此指向新节点。我认为这是在说 head 正在获取新节点指向的值,因此指向第二个节点。不过我想我现在明白了,谢谢!
    【解决方案3】:
    #include<iostream>
    using namespace std;
    struct Node
    {
        int data;
        Node *link;
    };
    class LinkList
    {
        Node *headptr;
    public:
        LinkList()
        {
            headptr=NULL;
        }
    
        void InsertatFirst(int val)
        {
            Node *newNode;
            newNode = new Node;
            newNode ->link =NULL;
            newNode ->data = val;
            newNode ->link=headptr;
            headptr = newNode;
        }
    
        void Display()
        {
            Node *disNode;
            disNode = headptr;
            while(disNode !=NULL)
            {
                cout<<"Display Node Value is "<<disNode ->data<<endl<<endl;
                disNode =  disNode->link;
            }
        }
    
    };
    void main()
    {
        LinkList lobj;
        lobj.InsertatFirst(45);
        lobj.InsertatFirst(2);
        lobj.InsertatFirst(1);
        lobj.InsertatFirst(0);
        lobj.InsertatFirst(-1);
        lobj.Display();
    }
    

    【讨论】:

    • 虽然这段代码可以回答这个问题,但最好包含一些上下文,解释它是如何工作的以及何时使用它。从长远来看,纯代码的答案没有用处。
    【解决方案4】:
    void addToFront(int data) {
      Node* tmp = new Node(t); //assume your Node constructor can handle this
      if(numElements != 0) {   //should check weather empty or not
        x->next = head;        //link them first
        head = x;             //and now make the head point to the new head
      } else {      //if empty you should also set the tail pointer
        head = x;
        tail = x;
      }
      numElements++;
    }
    

    如果有头,则新节点“next”将指向当前指向另一个节点的头。然后head=x,head指针现在被设置为指向新节点而不是前一个节点

    【讨论】:

      猜你喜欢
      • 2019-12-16
      • 1970-01-01
      • 2020-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多