剑指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; } }
相关文章推荐
- 剑指Offer学习总结-在O(1)时间删除链表结点
- [剑指offer学习心得]之:在O(1)时间删除链表结点
- 《剑指Offer》学习笔记--面试题57:删除链表中重复的结点
- 《剑指offer》面试题57 删除链表中重复的结点 C++ 实现 以及 错误总结 (指针问题)!!
- 剑指offer--面试题57:删除链表中重复的结点
- 剑指offer 面试题13:在O(1)时间删除链表结点(C++版)
- 剑指offer(33)-在O(1)时间删除链表结点[数据结构]
- 数据结构与算法分析笔记与总结(java实现)--链表10:输入某个结点删除单向链表中的该结点
- 剑指Offer笔记—— 数值的整数次方 在O(1)时间删除链表结点
- Java双向链表的创建结点,清空链表,添加结点,删除结点
- c链表结点的删除和添加
- (剑指Offer)面试题57:删除链表中的重复结点
- 寒假自主学习项目一 - 链表(3、删除第一个结点)
- 剑指offer——删除链表中重复的结点(好题!)
- 【剑指Offer学习】【面试题13 :在O(1)时间删除链表结点】
- 剑指offer--删除链表中重复的结点
- 剑指offer 面试题57 删除链表中重复的结点
- 《剑指offer》:删除链表中重复的结点
- 《剑指Offer》学习笔记--面试题15:链表中倒数第k个结点
- 剑指offer 删除链表中重复的结点