剑指offer面试题13扩展------Linus:利用二级指针删除单向链表
Torvalds大婶:很多人不了解如何写核心底层代码
收藏 分享
|
|
Talk is cheap, show me the code——空谈误国,实干兴邦!
|
|
GentileHP
![]() 金牌会员 |
2#
![]()
|
|
Talk is cheap, show me the code——空谈误国,实干兴邦!
|
||
TOP |
||
GentileHP
![]() 金牌会员 |
3#
![]()
|
|
Talk is cheap, show me the code——空谈误国,实干兴邦!
|
||
让我们来人肉跑一下这个代码,对于——
- 删除节点是表头的情况,输入参数中传入head的二级指针,在for循环里将其初始化curr,然后entry就是*head(*curr),我们马上删除它,那么第8行就等效于*head = (*head)->next,就是删除表头的实现。
- 删除节点不是表头的情况,对于上面的代码,我们可以看到——
1)(第12行)如果不删除当前结点 —— curr保存的是当前结点next指针的地址。
2)(第5行)entry 保存了 *curr——这意味着在下一次循环:entry就是prev->next指针所指向的内存。
3)(第8行)删除结点:*curr = entry->next; —— 于是:prev->next 指向了 entry -> next;
是不是很巧妙?我们可以只用一个二级指针来操作链表,对所有节点都一样。
如果你对上面的代码和描述理解上有困难的话,你可以看看下图的示意:
(全文完)
利用二级指针进行单链表节点操作的完整代码(重点是单链表的节点的删除)
#include<iostream>
#include<cstdlib>
using namespace std;typedef struct node
{int data;struct node *next;
}Node;void insert_node(Node **pphead,int v)
{if(*pphead==NULL){*pphead=(Node *)malloc(sizeof(Node));(*pphead)->data=v;(*pphead)->next=NULL;}else{Node *t=*pphead;*pphead=(Node *)malloc(sizeof(Node));(*pphead)->data=v;(*pphead)->next=t;}
}
void delete_node(Node **pphead,int v)
{Node **cur=pphead;for(cur=pphead;*cur;){Node *en=*cur;if(en->data==v){*cur=en->next;free(en);break;}else{cur=&en->next;}}
}
void print_node(Node **pphead)
{for(Node **cur=pphead;*cur;cur=&(*cur)->next){cout<<(*cur)->data<<" ";}cout<<endl;
}
int main(void)
{Node *pfrist=NULL;for(int i=1;i<=5;i++)insert_node(&pfrist,i);print_node(&pfrist);delete_node(&pfrist,1);print_node(&pfrist);delete_node(&pfrist,5);print_node(&pfrist);delete_node(&pfrist,3);print_node(&pfrist);delete_node(&pfrist,6);print_node(&pfrist);free(pfrist);pfrist=NULL;return 0;
}
剑指offer面试题13扩展------Linus:利用二级指针删除单向链表相关推荐
- 剑指offer面试题13:O(1)删除链表结点
面试题见剑指offer: struct ListNode { int value; ListNode *next; }; void DeleteNode(ListNode **pListHead,Li ...
- [剑指offer]面试题13:在O(1)时间删除链表结点
面试题13:在O(1)时间删除链表结点 题目:给定单向链表的头指针和一个结点指针,定义一个函数在 O(1)时间删除该结点.链表结点与函数的定义如下: struct ListNode {int valu ...
- 剑指Offer - 面试题13. 机器人的运动范围(BFS/DFS)
文章目录 1. 题目 2. 解题 2.1 BFS 2.2 DFS 1. 题目 地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] .一个机器人从坐标 [0, 0] 的格子开始移动 ...
- 剑指offer面试题13:机器人的运动范围
题目描述:地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] .一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左.右.上.下移动一格(不能移动到方格外),也不能进入 ...
- [剑指offer]面试题第[3]题[JAVA][从尾到头打印链表][栈]
[问题描述] 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. /** * public class ListNode { * int val; * ListNode next = nu ...
- 剑指offer面试题(11-20)——java实现
面试题整理(自用) 面试题11:数值的整数次方 面试题12:打印1到最大的n位数 面试题13:在O(1)时间删除单向链表的节点 面试题14:调整数组顺序使奇数位于偶数前面 面试题15:链表中倒数第k个 ...
- 剑指offer 面试题三 找出数组中重复的数字
1 import org.junit.Test; 2 3 import java.util.Arrays; 4 import java.util.HashSet; 5 6 public class D ...
- 剑指offer——面试题44:扑克牌顺子
剑指offer--面试题44:扑克牌顺子 Solution1: 20180907重做 书上的思路. class Solution { public:bool IsContinuous(vector&l ...
- C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解
剑指offer 面试题39:判断平衡二叉树 提交网址: http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId= ...
最新文章
- 初步了解win32界面库DuiLib
- SQL Server扩展事件(Extended Events)-- 将现有 SQL 跟踪脚本转换为扩展事件会话
- Logger.getLogger和 LogFactory.getLog
- 基于java家教管理系统_基于jsp的家教信息管理-JavaEE实现家教信息管理 - java项目源码...
- Nginx 作为 WebSockets 代理
- 调用kmeans_聚类分析—KMeans
- IBM Cloud Paks:云端追光者也!
- 关于字符串和字节编码的问题(转)
- [BZOJ3245]最快路线
- 网络协议栈深入分析(四)--套接字内核初始化和创建过程
- 9.python-匿名函数(lambda)
- 数据科学家在“新常态”下发生了怎样的转变?
- 新款iPhone现已曝光,跟风华为“浴霸三摄”,没有5G版本
- TDS、NET-Library和网络协议
- android 串口键盘_侧面滑盖+实体全键盘的安卓手机,能走向大众化吗?
- java 高级调试_多种高级debug方法,帮你更快定位问题
- 服务器电脑cpu性能排行,服务器cpu性能排行,小编教你服务器cpu性能排行
- 【田间连着车间、佘太酒业这十年!
- IntelliJ IDEA的maven如何提高下载速度
- signature=735f4378ec01919f23285d0d2557be19,OPENSSL编程 第二十章 椭圆曲线