LeetCode总结2-Linked List

根据我们之前的思路,开始Linked List的学习。

链表和数组有许多相似的地方,最基本的操作无外乎,增加元素、删除元素、交换元素、获得某元素。在此基础上附加各种条件,进而就能转换为我们的问题来进行求解了。我以为,链表和数组在操作上最大的不同在于,数组能直接进行下标index操作,如果能用下标,将会是很方便的。既然不方便,那出题的考点就来了,如何找到类似于数组的各元素之间的下标关系。
最基础的是two pointer.一个slow pointer和一个fast pointer。faster pointer每次走两步,slow pointer 每次走一步,当faster pointer走到数组的最后时,slow->next即为数组的conner了。这一点被应用到很多的情况中去。如L0->L1->...->Ln-1->Ln  变化为 L0->Ln->L1->Ln-1->...解题思路就是,partition as by center,reverse the next part,then merge two part。
上面的问题中涉及到reverse linked list 。一般我们有两种思路:1、重新建立一个单链表newList,每次将list中的第一个结点放到newList后面,然后将newList的后部分接到新连节点的后面。2、第二种方法是每次都将原第一个结点之后的那个结点放在list后面,下图是原始的单链表。(具体可以参考:http://www.cnblogs.com/pianoid/archive/2011/05/03/reverse-a-singly-linked-list.html。注意此链接中所用链表的头节点并不是第一个数据节点)。链表翻转是基本知识,一定要会,再变化一下就是制定序号之间的链表翻转,关键要找准第一个位置。
找链表中的是否有环这也比较常规,可以结合set或用上面介绍到了slow and fast 双指针解决。拔高一点的要找出环的起始位置,用set的find来解的化基本没什么变化,但用slow and fast时,关键是要找到两个之间的对于数学关系.相应的扩展,可参考这篇文章(http://blog.sina.com.cn/s/blog_6f611c300101fs1l.html)。类似的还有Intersection of Two Linked Lists。找出两个有adjacent 的linked list的连接首节点。
链表问题中还有一大类,叫做排序,常考的主要有归并排序(merge sort)和快速排序(fast sort).这将在后面排序算法中详细展开,注意比较distinction between array and linked list。
接下来,还遇到了Convert Sorted List to Binary Search Tree。这和归并排序有点像。注意用recursive时,是传值调用还是传址调用,对于需要新建节点的,一定要用new来申请空间。
最后,注意一点。即:whether node->val can change or not。
好了,今天就先到这,下次我们一起来探讨Hash Table。

你可能感兴趣的:(LeetCode,链表)