二级指针笔记
这两天在leetcode上碰到一个这样的题目,Remove Nth Node From End of List,这个题目学习到了两种新的方法。
1.路标标记法
2.二级指针应用
首先是关于路标标记,以后如果碰上这样一种情况,要从一个类似于链表结构的不可逆的对象的结尾开始取相对位置,则可以用一个先行路标p走X个位置,走了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指向的地址是curr,curr里的东西就是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