面试题24:翻转链表
定义一个函数,输入一个链表的头节点,翻转该链表并输出翻转后的头节点。
Struct ListNode{intm_nKey; ListNode* m_pNext;}
测试用例:
功能测试:输入的链表含多个节点/一个节点;
特殊输入:链表是null;
分析:
1. 需要3个指针,当前节点pNode、下一个节点pNext、上一个节点pPrev;
2. 翻转后的头指针要指向翻转前的尾节点;翻转后的尾节点的要指向null;
面试题25:合并两个排序的链表
输入两个递增排序的链表,合并这两个链表并使新链表的节点仍按是递增排序的。
测试用例:
功能测试:输入两个链表中有多个节点/只有一个节点;节点值互不相等/存在相等;
特殊输入:两个链表中一个头节点为null;两个链表头节点都为null;;
分析:
1. 两个链表有一个为空,则返回两一个另一个链表头节点;都为空返回null;
2. 比较两个链表的头节点,较小的作为新链的头节点,新链头节点的下一个节点是 去掉所选节点后 的两个链的头节点;
3. 可用递归实现;
面试题26:树的子结构
输入两棵二叉树A和B,判断B是不是A的子树。
Struct BinaryTreeNode{doublem_dbValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;}
测试用例:
功能测试:B是/不是A的子树;B的节点右分叉(不是完全二叉树);只有左子节点/右子节点;
特殊输入:树A和B都是null;树A和B有一个是null;
分析:
1. 判断两个小数是否相等,不能用“==”,计算机表示小数都有误差,只能判断两个小数的差绝对值是否小于一个很小的数(如0.000001);
2. 每次使用指针时,问自己这个指针是否可能是null,是的话该如何处理;
3.5 总结
规范性:书写清晰、布局合理、命名合理
完整性:基本功能、边界条件、错误处理
鲁棒性:采取防御性变成;在函数入口判断输入的有效性,处理无效的输入;