数据结构 --- 单链表

在面对链表的题目时,大部分人(包括我自己)都是很怵的,因为这必将面临指针。

笔者今天实现了一些关于链表操作的题目。

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


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

[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:所有代码的易错点均在代码注释中~~~~




你可能感兴趣的:(面试题,单链表)