单链表题目

1. 单链表反转

一个指针(引用)curr指向原链表头;头指针head指向当前头(开始时指向原链表头),

循环开始:

  1. next指向curr下一个节点,即next = curr.next;
  2. nextNext指向next下一个节点,即nextNext = next.next;(前两步根据curr更新next和nextNext的位置
  3. next.next = head; 
  4. head = next;
  5. curr.next = nextNext; (后三步把next所指节点调到链表头,curr的下一个节点变成nextNext
直到 curr.next = null, 此时curr为最后一个节点。可以发现,整个过程中curr指向的节点一直没变。

2. 找出单链表倒数第4个元素

维持两个指针a,b,指针a先走4步,之后指针a,b一起向后移动,当a走到末尾时,b所指元素即为倒数第4个元素。

3. 找出单链表中间元素

维持两个指针a,b,a每次走两步,b每次走一步,则a到最后的时候,b指向中间元素。

只是这里的结束条件需要注意是 a = null 或者 a.next = null。

因为对于偶数,最后是a = null结束,同时b和之前的元素(遍历时记录b之前元素的值)都算中间元素;

对于奇数,最后是a.next = null结束,b是中间元素。

4. 知道指向单链表中某节点的指针curr,O(1)删除节点

把curr.next所存的元素给curr,同时删除curr.next。

需要注意的是,如果curr是最后一个元素,则要从头遍历来删除。

5. 判断两个单链表是否相交

如果两个单链表的末尾元素相等,则必然相交。

6. 两个单链表相交,计算相交点

分别遍历两个单链表,计算出它们的长度M和N。如果M比N大,则长度M的链表先前进M-N,然后两链表同时前进,并判断是否同一个节点,是同一个节点,则必然是交点。

7. 判断单链表是否有环?如何知道环的长度?如何找到环的起始点?

  • 判断是否有环?建立两个指针,从head一起往后,一个每次移动1,一个每次移动2,用while(直到步长2的跑到结尾)检查两个指针是否相等(这里的相等指引用同一个对象,在java中用==表示),若找到相等,说明有环。
  • 如何知道环的长度?在上面步骤中,记下两指针相遇的地方P,节点P肯定在环上,从这个节点往前走并计数,下次到达此节点,就可以得到环的长度。
  • 如何找到环的起点?可以转化为寻找两相交单链表交点的问题。其中一条链表从head开始,另一条从节点P开始,两链表以在此遇见P为终点。
8. 单链表排序

用插入排序。

9. 删除单链表中重复的元素

用HashTable辅助,curr从头开始,将头放入hashtable,判断curr.next是否重复(hashtable位置是否有元素),如果重复,删除,如果不重复,存入hashtable,直到curr.next为null。

你可能感兴趣的:(算法基础)