链表的添加和删除

链表作为最频繁的数据结构,当然需要好好掌握复习。

注意点主要是对头指针的处理,及特殊情况的处理,如空链表。

下面是在链表末尾添加数据:

struct ListNode
{
    int data;
    ListNode* p_next;
};

void AddToTail(ListNode** phead, int value)
{
    ListNode* p_new = new ListNode();
    p_new->data = value;
    p_new->p_next = NULL;

    //如果是空链表
    if( *phead ==NULL)
    {
        *phead = p_new;
    }
    else
    {
        ListNode* pNode = *phead;
        while(pNode->p_next != NULL)
            pNode = pNode->p_next;

        pNode->p_next = p_new;
    }
}

传入指针的指针是因为如果空链表的话我们需要改变这个传进来的指针。

下面是删除链表中的指定值的第一个数:

void RemoveNode(ListNode** phead, int value)
{
        //更好的鲁棒性
    if(phead == NULL || *phead == NULL)
        return;

    ListNode* p_deleted = NULL;
    
    if( (*phead)->data == value)//如果要删出的是头节点
    {
        p_deleted = *phead;
        *phead = (*phead)->p_next;
    }
    else
    {
        ListNode* pNode = *phead;
        while(pNode->p_next !=NULL && pNode->p_next->data !=value)
        {
            pNode = pNode->p_next;
        }
        
        if(pNode->p_next  !=NULL && pNode->p_next->data ==value)//此时pNode指向要删除节点的前一个节点
        {
            p_deleted = pNode->p_next;
            pNode->p_next = pNode->p_next->p_next;
        }
    }
        if(p_deleted !=NULL)
        {
            delete p_deleted;
            p_deleted = NULL;
        }
}
    

简单但却也经典。

posted @ 2013-03-01 21:02  没离开过  阅读(211)  评论(0)    收藏  举报