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