数据结构 --- 单人名单

在主题列表的脸,大部分的人(包含自己)他们是非常胆小,由于这是必然要面对的指针。

今天,我意识到一些议题上的列表操作。

首先,定义单链表中的节点:


注:上述的删除链表函数是必须的。否则内存泄露将会是最大的问题。

[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:全部代码的易错点均在代码凝视中~~~~




版权声明:本文博主原创文章。博客,未经同意不得转载。

posted @ 2015-09-02 09:24  zfyouxi  阅读(180)  评论(0编辑  收藏  举报