总结之链表

1. 链表的基本操作:

head表示是第一个节点,我们会通常在第一个节点前加一个dummy节点。这样可以避免处理头指针,统一处理所有的情况,最后返回dummy->next。比如说,我们在删除节点的时候,在第K个元素前插入节点。。。这些情况都隐含包括头节点场景,用dummy节点可以统一处理,不用单独拎出来。另外注意,如果可能会修改头结点的,函数一定要返回新的头结点。


这里的操作包括:创建空链表,建立链表(头插入,尾插入),找前驱节点,增加一个节点(节点之前/之后),第K个元素之前(之后)插入新节点,删除节点,链表reverse(头结点插入,产生一个新链表),链表reverse(不产生新链表),链表的显示,链表的摧毁

http://blog.csdn.net/chencheng126/article/details/39138605



2.Add two numbers

1.使用尾插法

2.考虑进位carry

3.两个链表长度不一致的处理

4.最后carry如果大于0,需要新建一个node.

http://blog.csdn.net/chencheng126/article/details/39030329

有一个类似的题目是Add binary,对应的是字符串的加法

1.从末位开始加,可以先string.reverse,这样可以顺序操作。

2.数字串和数字的转换。a[i]-'0'得出的是a[i]对应的int;val+'0'得出的就是val对应的string.

3.得到的结果往字符串前面插入,保证末位的数字在最后面。

4.考虑进位。

http://blog.csdn.net/chencheng126/article/details/39525233



3.Reverse Linked List II

这个要注意细节,是链表的逆序的升级版

http://blog.csdn.net/chencheng126/article/details/39157953

普通链表的逆序可以参考

http://blog.csdn.net/chencheng126/article/details/43734935


4.Partition List

将比x小的放到左链表,其它放到右链表。最后将两个链表链接起来。

从原来的链表中依次取节点数据,用尾查法插入新的链表中,可以保留原来的顺序。尾插法可以用while去找到最后一个节点,但在此例用一个指针,每次插入后指向当前的节点,这样就始终指向最后一个节点,不用while去找了。

http://blog.csdn.net/chencheng126/article/details/39205063


5.Remove Duplicates from Sorted List

删除重复的元素,链表是排好序的。

http://blog.csdn.net/chencheng126/article/details/39205121


6.Rotate List

1.链接成环

2.从首个节点,继续走len-k个节点,断环

http://blog.csdn.net/chencheng126/article/details/39208435



7.Remove Nth Node From End of List

两个指针,p先走n步,然后q开始走。当p走到末尾时,q正好到了待删除节点。

http://blog.csdn.net/chencheng126/article/details/39210625



8.Swap Nodes in Pairs

http://blog.csdn.net/chencheng126/article/details/39210639



9.Reverse Nodes in k-Group

每k个元素为一个group,翻转,然后串联起来。如果不够k个元素,则维持不变。

http://blog.csdn.net/chencheng126/article/details/39210647


10.Linked List Cycle

通常的考点有:1)有没有环。2)环的入口节点。3) 环的长度。

http://blog.csdn.net/chencheng126/article/details/39210665


11.Reorder List

这个题考查了链表的一些基础操作

找到中间节点,断开

后半截链表reverse

合并两个链表

http://blog.csdn.net/chencheng126/article/details/39210669


12.Merge Two Sorted Lists

有序链表的合并。尾插法,从前向后遍历两条链表,选择较小的插到链表尾部;比较完后,如果一条链表还有剩余,插入到最后。

http://blog.csdn.net/chencheng126/article/details/39293859

有序数组的合并。也有一个例子:

选择从后往前操作,选择较大的数据,可以避免不必要的操作。如果一个数组还有剩余,直接插入即可。

http://blog.csdn.net/chencheng126/article/details/39293825


13.Insertion Sort List

链表的插入排序。

对于数组的插入排序。假如前n-1个元素是有序的,将第n个元素插入进有序数组。要做两件事情,第一件事情找到要插入的点,第二件事情,因为数组是一块连续的内存,需要将插入点后的元素后移。这是基本的思路,当然我们可以采用swap的方法,将第n个元素,与n-1比较,如果大什么也不操作,如果小则交换;然后与n-2比较。。。这样做的好处是,避免元素后移的effort。

对于链表的插入排序,就不用考虑元素后移了。因为链表使用的是指针链接不同的节点,并不是连续的内存。所以我们只是要找到要插入元素的前驱,插入即可。

http://blog.csdn.net/chencheng126/article/details/39293907


14.Sort list(归并排序)

要求时间复杂度是o(nlogn),空间复杂度是常量。

要求o(nlongn)马上想到的就是归并和快排,只是这两种我们通常用于数组,这是对链表。

一般归并要求的空间复杂度不会是常量,要求o(n)的空间复杂度,因为它要复制相等的空间用来合并。但是在链表中要求常数的空间复杂度也是可以的。

快排一般不太用于链表的排序,因为链表不能随机访问,相对于归并来说,数据交换的次数太多,会超时。

这里有一篇实现,先mark,回头再写。

http://blog.csdn.net/chencheng126/article/details/43877243


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值