链表
链表第一个公共节点:1) 利用栈先进后出,用两个栈对两个链表从头至尾遍历,那么栈顶就为链表的尾节点,依次弹出两个栈,直到弹出的元素不一样时,前一个相同的即为第一个公共节点. 2)分别遍历一次两个链表,算出长度差L,让长的链表的指针先走L步,然后两个指针同时移动,那么第一次指向同样节点的即为公共节点
判断是否存在环:两个指针,每次慢指针走1步,快指针走2步,如果快的最后追上慢的,那么有环
判断环的长度:从快指针追上慢指针的那个节点开始(此时一定是在环内),再让快慢指针同时移动,第二次快指针追上慢指针时,记录两个指针走过的步数,差值为环的长度
寻找入环口:一个指针从第一次快指针追上慢指针的那个节点开始,一个指针从链表头开始,两个指针同时移动,每次移动一步,如果两个指针的下一个节点相同,那么那个节点就是入环口
给定单链表节点,删除此节点: 把后面一个节点内容复制到此节点,然后把此节点的p.next指针指向p.next.next即可
链表的倒数第k个节点: 1)前后指针,后指针先走k步,然后两个指针同时后移,直到后指针指向尾节点,那么前指针即为所求. 2) 用栈储存链表,然后弹出节点,弹出的第k个即为所求
树:
- 根据二叉树前序,中序还原二叉树:前序的特点是根节点在序列第一位,然后在中序中找到这个根节点,左边的就是左子树所有的节点,右边就是右子树所有的节点,然后递归构造左边的序列和右边的序列
栈
两个栈实现队列: 栈1为主栈,push函数实现:直接押入栈1。pop函数:判断栈2是否为空,若是,把栈1的元素pop再push进去,直到栈1空,然后把栈顶元素pop;若非空,则直接pop即可。
两个队列实现栈:push方法正常入队deque1,当要pop出最后一个进去的元素时,将前面的元素出队并入队在deque2中,然后把最后一个元素出队。如果要再出队一个元素,那么就把deque2的前面元素出队再入队至deque1中,保持两个队列一个为空,插入元素时插入非空的队列