数据结构与算法系列之链表操作全集(三)(GO)
以下完整的代码,及测试代码均可从这里获取github
删除单向链表倒数第n个结点
方法一:快慢指针法
思路
删除倒数第N个结点,假设反过来看,要删除第N个节点。那么,一个指向头结点(头结点中也是一个数据结点)的指针向前移动N-1个结点后,指向的就是第N个结点
现在再看删除倒数第N个结点,假设此时有两个指针(快指针fastPtr、慢指针lowPtr)均指向头结点,快指针fastPtr向后遍历N-1个结点之后,慢指针和快指针开始一起向后遍历,当快指针到达最后一个结点的时候,慢指针指向的位置,就是倒数第N个结点的位置
###### 代码实现
方法二:结点位置和结点数量的关系法
思路
不知道怎么删除倒数第N个结点,想办法知道它是第几个不就行了。所以,关键是通过链表长度以及N来找到倒数第N个结点是正数第几个节点,通过观察可以得到,倒数第N个结点就是正数第length-N+1个结点,length为链表长度
代码实现
说明:删除单链表头结点、尾结点、指定位置的节点实现,可以参考我的这一篇文章,或者这里
两个有序的单链表合并
该题也是LeetCode上第21题
方法一:常规方法
思路
常规思路就是,创建一个新的链表,然后遍历待合并的两个链表,比较遍历到的两个结点值的大小,假设要合并之后的链表按照从小到大排序,值小的那个结点插入到新的链表中,并将值小的那个结点向后遍历一位,值大的那个结点保持不变,然后继续比较,重复上边步骤,如图(注意:为了展示过程,下图中未考虑链表是否为空的情况)
###### 代码实现
方法二:递归
思路
将上边的常规解法用递归来实现,主要是递归的终止条件
代码实现
版权声明: 本文为 InfoQ 作者【书旅】的原创文章。
原文链接:【http://xie.infoq.cn/article/b19cc049ce91f3196d495b7ba】。文章转载请联系作者。
评论