《算法之美》の链表问题の记住头元素+删除元素

记住头元素:

单向链表的头元素必须至始至终要记住,否则链表将会在内存中丢失。这意味着在链表第一个元素之前插入新元素或删除链表第一个元素时,指向链表头的指针或引用必须更新。

C/C++中,很容易因误用指针而犯错误,如下面代码,它在链表的前面插入一个元素:

bool insertInFront(IntElement *head, int data)

{

         IntElement *newItem = new IntElement;

         if(!newItem)

                   return false;

         newItem->data = data;

         newItem->next = head->next;

         head = newItem;           //错误

         return true;

}

上面的代码是不正确的,因为它只更新了头指针的“本地拷贝”。正确的版本是传入一个头元素指针的指针:

bool insertInFront(IntElement **head, int data)

{

         IntElement *newItem = new IntElement;

         if(!newItem)

                   return false;

         newItem->data = data;

         newItem->next = head->next;

         *head = newItem;                  //正确啦

         return true;

}

当然,在C++中,头指针也可以通过引用来传递。

 

删除单个元素:

bool deleteElement(IntElement **head, IntElement *deleteMe)

{

         IntElement *elem = *head;

 

         if(deleteMe == *head)        //要删除的是头元素

         {

                   *head = elem->next;

                   delete deleteMe;

                   return true;

         }

 

         while(elem)

         {

                   if(elem->next == deleteMe)

                   {

                            elem->next = deleteMe->next;

                            delete deleMe;

                            return true;

                   }

                   elem = elem->next;

         }

 

         return false;

}

 

删除链表中的所有元素:

void deleteList(IntElement **head)

{

       IntElement *deleteMe = *head;

       while(deleteMe)

       {

              IntElement *next = deleteMe->next;

              delete deleteMe;

              deleteMe = next;

       }

       *head = NULL;

}

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值