信息学竞赛宝典:数据结构基础
上QQ阅读APP看书,第一时间看更新

1.3.7 节点的删除

因为链表中唯一能够找到节点的办法是使用上一个节点的指针,所以如果我们将某个节点直接删去,这个节点所指向的节点和它之后的所有节点都没有办法再找到了。为了解决这个问题,一般采取这样的方法:记录下要删除的节点之前的那个节点,在删除节点之前,把这个节点的指针指向要删除的那个节点的指针指向的节点。比如现在要删除图1.3所示链表中的节点t,先找到它之前的节点p,在删除t之前将p的指针指向节点c,然后删除t,这样在删除t之前,就已经把t从链表中剔除出来了,不会影响之后的节点。

图1.3

参考代码如下,其中第7行,表示将括号内指针指向的内存空间释放。记住,用new动态开辟的内存空间,一定要用delete()释放;否则,即便程序运行结束,这部分内存空间仍然不会被操作系统回收,从而成为被白白浪费掉的“内存垃圾”,这种现象称为“内存泄漏”。

 1    Link Del(Link Head,int i)                        //删除i位置上的节点
 2    {
 3      Link p=Head,t;
 4      if(i==1)                                       //如果是第一个节点
 5      {
 6        Head=Head->next;
 7        delete(p);                                   //删除Head指向的节点
 8      }
 9      else
10      {
11        int j=1;                                     //j为计数器
12        while(j<i-1 && p->next !=NULL)               //找到删除的前一个位置
13        {
14          p=p->next;
15          j++;
16        }
17        if(p->next!=NULL && j==i-1)
18        {
19          t=p->next;
20          p->next=t->next;
21        }
22        if(t!=NULL)
23          delete(t);                                 //释放节点内存空间
24      }
25      return Head;
26    }