2013-10-05 49 views
3

我真的很困惑,究竟是怎么回事的前..添加节点到链表

我具备的功能

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

所以,当我们做线tmp-> next = head,我们正在将tmp指针指向head指向的内容(列表的当前第一个元素)?因为这就是它的感觉,但不会只是让它指向head?然后当我们做head = tmp时,我们正在向我们创建的新节点指出正确的方向?

回答

1

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

正确。

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

否。要指向开头,需要包含地址的头部。但是这条线使得它包含头部的。所以不行。

然后当我们做head = tmp的时候,我们正在把头指向我们创建的新节点,对吗?

是的。

+0

@so然后,因为指针的值是它指向的东西的地址,所以tmp得到头的价值意味着它得到了什么头指向的地址.. – FrostyStraw

+0

这是正确的。 'tmp - > next = head;'给出'tmp - > next'和'head'相同的值。因此'tmp - > next'现在指向'head'指向的任何东西。 –

+0

但后来不会头= tmp意味着头现在指向任何tmp指向?现在不是tmp指向以前是链表上的第一个节点吗? – FrostyStraw

11

这是怎么了你的清单(假设)

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

Head指向位置A

你让一个新的节点

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

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

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

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

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

head & tmpB现在。

+1

这里是一个完整的实现http://stackoverflow.com/questions/19148576/memory-leak-in-removehead-function/19150590#19150590 – ChuckCottrill

0
#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(); 
} 
+1

虽然这段代码可能回答这个问题,但最好包含一些上下文,解释它如何工作以及何时使用它。从长远来看,仅有代码的答案是没有用的。 – Bono

0
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++; 
} 

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