03链表的插入和删除操作

//链表是一种动态数据结构,再创建链表时,无需知道链表的长度。
//插入链表时,分配内存(每添加一个)--调整指针指向---使其插入到链表中。
//遍历链表是从头结点遍历的,但是要备份头结点,用临时结点去遍历
//首先必须会定义一个链表结点--以下是单链表
//双链表的节点定义没有值。
看到链表,二话不说,先定义一个链表节点,
单链表的定义
struct ListNode
{
    int val;
    struct ListNode* next;
};
双链表的定义
struct DListNode
{
    struct DListNode* pre;
    struct DListNode* next;
};

//向链表的末尾添加一个节点
void AddToTail(ListNode** pHead, int value)
{
    ListNode* pNew = new ListNode();
    pNew->val = value;
    pNew->next = NULL;

    //鲁棒性
    if (pHead == NULL)
    {
        *pHead = pNew;
    }
    else
    {
        //遍历链表,就要用备份结点进行操作。
       //改变结点的指向,是对结点进行操作
        ListNode* tmpNode = *pHead;
        while(tmpNode->next != NULL)
        {
            tmpNode = tmpNode->next;
        }
        tmpNode->next = pNew;
    }
}

//----------------向链表的末尾删除一个结点---------------------
void RemoveNode(ListNode** pHead, int value)
{
    if (pHead == NULL ||*pHead == NULL)
    {
        return;
    }
    ListNode* pDeleteNode = NULL;
    //分2种情况:头结点就是删除的结点;头结点不是要删除的结点
    if(*pHead->val == value)
    {
        //节点的操作
        pDeleteNode = *pHead;
        *pHead = (*pHead->next);
    }
    else
    {
        ListNode* tmpNode = *pHead;
        while(tmpNode->next!= NULL)
        {
            if (tmpNode->next->val == value)
            {
                break;
            }
            tmpNode = tmpNode->next;

        }
        pDeleteNode = tmpNode->next;
        tmpNode->next = tmpNode->next->next;
    }
    if (pDeleteNode != NULL)
    {
        delete pDeleteNode;
        pDeleteNode = NULL;
    }
}

 

posted @ 2017-08-03 23:16  繁星的夜空2012  阅读(171)  评论(0编辑  收藏  举报