-1

// 变量

typedef struct node 
 { 
    int value; 
    struct node *next; 
 }mynode;

// 全局变量(虽然不是必需的)。

mynode *head, *tail, *temp; 

// 职能

void add(int value);

// 添加新节点到链表的函数

 void add(int value)
 {
    temp = (mynode *) malloc(sizeof(struct node));
    temp->next=(mynode *)0;
    temp->value=value;

    if(head==(mynode *)0)
    {
       head=temp;
       tail=temp;
    }
    else
    {
      tail->next=temp;
      tail=temp;
    }
 }

// main() 函数

int main()
 {
     head=(mynode *)0;

     // Construct the linked list.
     add(1);
     add(2);
     add(3);

     return(0);
 }

如果我只有一个指向节点的指针,其值为 3(上述代码中看到的最后一个节点),我们可以删除它并让一个值为 2 的节点(上述代码)作为最后一个节点。

4

5 回答 5

2

你不能。除非您对先前的节点有一些参考。像头指针。如果您有其他参考,那么它就容易多了。实际上,如果您没有任何指针,您将失去列表本身

于 2012-02-15T05:39:17.037 回答
1

不,但是如果您知道自己在做什么,则可以就地修改最后一个节点。删除最后一个节点需要访问倒数第二个节点,特别是它与最后一个节点的链接。

于 2012-02-15T05:28:36.850 回答
0

是的,你可以..试试下面的代码:

void deleteNode()
{
    mynode *temp1;
    for(temp1 = head; temp->next!= tail; temp1 = temp1->next);
    tail = temp1;
    free(tail->next);
}

它将删除最后一个节点。

于 2012-02-15T05:30:08.133 回答
0

答案是不。

您可以调用free指向最后一个节点的指针,但这仅意味着不再声明该节点占用的内存。数据很可能会在一段时间内保持不变。这意味着倒数第二个节点的指向它的指针仍然有效,即使它不应该有效。

要以对列表有意义的方式删除节点,必须使倒数第二个节点中包含的指针无效。除非可以通过指向它的直接指针或通过从前一个节点遍历列表来访问倒数第二个节点,否则这是无法完成的。

于 2012-02-15T06:10:26.040 回答
0

您可以使用双向链表访问前一个节点。或者遍历整个列表。

于 2012-06-01T20:01:01.373 回答