您的位置:首页 > Web前端

剑指Offer学习总结-链表添加尾结点-删除结点

2018-01-16 10:50 316 查看

剑指Offer学习总结-链表添加尾结点-删除结点

本系列为剑指Offer学习总结,主要是代码案例的分析和实现:

书籍链接:http://product.dangdang.com/24242724.html

原作者博客:http://zhedahht.blog.163.com/blog/static/254111742011101624433132/

原作者博客链接有完整的项目代码下载。

添加尾节点

题目

题目: 输入一个链表的头结点, 添加一个结点到链表的末尾(节点插入的一种情况)

链表结点定义如下

struct ListNode
{
int       m_nValue;
ListNode* m_pNext;
};


直接的解法一:

我们首先直接使用一个结点,指向操作的节点,直至这个节点移动到链表的末尾,然后在当前节点(当前指向末尾)进行添加操作,

本例子只需要改变节点的Next节点和插入节点的Next节点即可。

//参数链表节点和插入的节点数据
//第一个参数 pHead 是一个指向指针的指针。当我们往一个**空链表**中插入一个结点时, 新插入的结点就是链表的头指针。
//由于此时会改动头指针, 因此必须把 pHead 参数设为指向指针的指针, 否则出了这个参数 pHead 仍然是一个空指针。
//相当于是&参数的作用,取变量的地址操作,出了函数的作用域,修改的数值还可以生效
void AddToTail(ListNode** pHead, int value)
{
ListNode* pNew = new ListNode();
pNew->m nValue = value;
pNew->m_pNext = NULL;
//传入参数为NUll的情况
if(*pHead == NULL)
{
*pHead = pNew;
}
else
{
ListNode* pNode = *pHead;

while(pNode->m_pNext != NULL)
{
pNode = pNode->m_pNext;
pNode->m_pNext=pNew;
}
}
}


删除节点

题目

题目: 在链表中找到第一个含有某值的结点并删除该结点

链表结点定义如下

struct ListNode
{
int       m_nValue;
ListNode* m_pNext;
};


直接的解法一:

我们首先直接使用一个结点,指向操作的节点,

每次判断操作的节点数值是否等于要删除的数值,直至这个节点移动到链表的末尾,

节点判断的情况

不等于,节点继续移动

等于,修改前一个点的Next节点为当前节点的下一个节点。

单独定义一个节点用来保存找到的删除节点,最后释放这个节点的内存。

建议刚开始的时候,可以使用直接的思路多利用变量来保存数据,如果后期发现可以优化可以省略在进行删减。

实现的方式不一定相同,但是思路是一致的,比如定义几个指针变量这些 不必细记。

void RemoveNode(ListNode** pHead, int value)
{
//边界条件处理
if(pHead == NULL || *pHead == NULL)
return;
ListNode* pToBeDeleted = NULL;
//要找的数值是第一个节点
if((*pHead)->m_nValue == value)
{
pToBeDeleted = *pHead;
*pHead = (*pHead)->m_pNext;
}
else
{
ListNode* pNode = *pHead;
//直接判断下一个节点  头结点上边已经判断过
while(pNodLe->m_pNext != NULL && pNode->m_pNext->m_nValue != value)
{
pNode = pNode->m_pNext;
}
//跳出循环的时候判断 是否是找到删除节点的那种情况
if(pNode->m_pNext != NULL && pNode->m_pNext->m_nValye == value)
{
pToBeDeleted = pNode->m_pNext;
pNode ->m_pNext = pNode->m_pNext->m_pNext;
}
}

if(pToBeDeleted != NULL)
{
//如果找到删除的节点  释放节点内存
delete pToBeDeleted;
pToBeDeleted = NULL;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: