在主题列表的脸,大部分的人(包含自己)他们是非常胆小,由于这是必然要面对的指针。
今天,我意识到一些议题上的列表操作。
首先,定义单链表中的节点:
注:上述的删除链表函数是必须的。否则内存泄露将会是最大的问题。
[updated]:上述删除链表的操作是有问题的,传入的參数必须是指针的指针或者是引用。或者返回head。由于须要将head指针置为空。这利用传值调用是办不到的。
接下来。定义链表的一些操作:
1 返回倒数第K个节点:
//有待更新
2 逆置链表;依次取出原链表中的元素,将其插入到新链表的头部.
注意。在逆置单链表的过程中,我犯了一个错误,见上述代码凝视:
3 推断链表是否是回文:
当然,推断回文还有其它方法,只是我仅仅想到这个,就直接实现了。
4 将链表的元素依据某个pivot进行partition,这能够用作链表快排的函数。
5 将两个链表中的元素相加,分为两个版本号,第一个是:
高位在表头。那么先将链表长度补成一致,再进行递归调用就可以。
低位在表头。
直接相加就可以,仅仅须要处理最后元素可能的进位!!
6 推断一个链表中是否有环,假设有。返回环的起点。假设没有,直接返回,
首先。推断一个链表是否有环,典型的追及问题,一个快指针fast,每次走两步,慢指针slow,每次走一步。
假设存在环,则慢指针一定会在进入环的第一圈内就与快指针相遇。假设不是第一圈,也就意味着,慢指针在第一圈时,会被快指针追上
并超过,显然是不可能的。假设在点i处超越,那么此时慢指针在i处,快指针在i+1处,那么前一步。快指针在i-1处。慢指针也在i-1处。这
与“指针不相遇”如果矛盾。
上述程序有些繁琐,特别是在处理 fast与slow的关系时,以下的代码比較简单也比較直观
PS:全部代码的易错点均在代码凝视中~~~~
版权声明:本文博主原创文章。博客,未经同意不得转载。