二级指针笔记

来源:互联网 发布:科学革命的结构 知乎 编辑:程序博客网 时间:2024/06/07 11:55

二级指针笔记

 

这两天在leetcode上碰到一个这样的题目,Remove Nth Node From End of List,这个题目学习到了两种新的方法。

1.路标标记法

2.二级指针应用

 

首先是关于路标标记,以后如果碰上这样一种情况,要从一个类似于链表结构的不可逆的对象的结尾开始取相对位置,则可以用一个先行路标pX个位置,走了x位置之后再从新初始化一个对象q指向头部,那么当p走到结束位置的时候,q就是相对于p距离x位置。

并且此时只用遍历一次。

 


 

 

然后就是二级指针。特地上网查了下,居然还有linus大佬的相关内容,简直强。假设有这样的一种情况,删除某个链表结点。

显然的,通常以前我的做法就是

/..../

ListNode *tmp= curr;

prev->next = curr->next;

curr = curr->next;

delete tmp;

 

当然,现实的情况往往没有这么简单,因为还要判断链prev指针是否为空(删除链表头的时候),所以,这样的代码就显得比较冗余。

 

然后,可以尽心一点小小的改进,定义一个二级指针curr(就算不怎么熟悉二级指针,但既然他是一个指针,那么就代表着一个地址,指针=地址是永远成立的),然后令他指向当前表头,然后再进行遍历。然后删除的时候只需要

 

ListNode **curr = &head;

/*....loop...*/

ListNode *entry = *curr;//curr地址中存放着当前的链表结点的实体

*curr = (*curr)->next;//curr的地址值存放的链表结点改变为下一个链表结点

delete entry

 

这样做的话就三行搞定了。为什么可以这样,原因是因为上一个指针的next指向的地址是currcurr里的东西就是prev->next,所以,我们可以直接改变curr里的东西,当perv指向的位置并没有发生改变,就不需要perv的帮助来删除链表结点。

 

然后总结差不多就这么多了,做了一些题目来巩固链表的知识。


https://leetcode.com/problems/merge-k-sorted-lists/#/description

https://leetcode.com/problems/remove-nth-node-from-end-of-list/#/description