剑指offer(Java版)day06:复杂链表的复制|二叉搜索
1复杂链表的复制
【题目】输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
【考察点】分解让复杂问题简单;链表
【思路】1、复制每个节点,如:复制节点A得到A1,将A1插入节点A后面。2、遍历链表,A1->random = A->random->next;3、将链表拆分成原链表和复制后的链表。
【错误】跟着这个思路来写,后来测试过程中的问题一直处在第三部分,我的写法是:
RandomListNode newHead=pHead.next;
RandomListNode tmp=newHead.next;
currNode=newHead;
while(tmp.next!=null)
{
currNode.next=tmp.next;
currNode=tmp.next;
if(currNode.next==null)
{
break;
}
tmp=currNode.next;
}
return newHead;
但是不能通过测试用例。
后来就改成讨论区里大神的写法。
折腾了一下午脑子特别乱,下次再好好理一理到底问题在哪里。
【注意】注意区分RandomListNode newNode=new RandomListNode(pHead.label);
和 RandomListNode newNode=pHead;的区别。
2二叉搜索树与双向链表
【题目】输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
【考察点】分解让复杂问题简单;二叉搜索树;双向链表
【思路】1.将左子树构造成双链表,并返回链表头节点。
2.定位至左子树双链表最后一个节点。
3.如果左子树链表不为空的话,将当前root追加到左子树链表。
4.将右子树构造成双链表,并返回链表头节点。
5.如果右子树链表不为空的话,将该链表追加到root节点之后。
6.根据左子树链表是否为空确定返回的节点。
【关键】一定要注意定位至左子树双链表最后一个节点这个步骤是放在递归左子树的语句的紧后面,然后再依次执行下面的语句。
这道题是跟着讨论区大神的思路写的,并不是自己的智慧结晶,希望二刷的时候能够自己独立完成o(╥﹏╥)o
3字符串的排列
【思路】输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
【考察点】分解让复杂问题简单;字符串
【思路】暴力解法,规定住第一位,让第一位挨个和后面每位进行交换;然后第一位后移,进行递归,直到最后一位。若List中不存在当前字符串则加入。递归完毕后将List用Collections中的方法进行排序,即变成字典序。
【错误】竟然是swap函数中的手误。。。所以每一个细节都要严谨严谨再严谨呀!
越到后面题越费脑筋,这道题依旧是跟着讨论区大佬的思路做出来的,希望下次自己能有点思路吧~