剑指offer_链表
lx8486
计算机学院学生,java爱好者
展开
-
从尾到头打印链表
题目描述输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。解题思路一种方法是利用栈来实现;另外一种方法是利用三个指针把链表反转,关键是 r 指针保存断开的节点。//使用栈 public ArrayList<Integer> printListFromTailToHead(ListNode listNode){ ArrayList<Integer>...原创 2019-03-29 22:21:22 · 115 阅读 · 0 评论 -
反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。解题思路设置三个指针,head为当前节点,pre为当前节点的前一个节点,next为当前节点的下一个节点,需要pre和next的目的是让当前节点从pre->head->next1->next2变成pre<-head next1->next2的过程中,用pre让节点反转所指方向,next节点保存next1节点防止链...原创 2019-03-29 22:24:42 · 100 阅读 · 0 评论 -
链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。解题思路经典的双指针法。定义两个指针,第一个指针从链表的头指针开始遍历向前走k-1步,第二个指针保持不动,从第k步开始,第二个指针也开始从链表的头指针开始遍历,由于两个指针的距离保持在k-1,当第一个指针到达链表的尾节点时,第二个指针刚好指向倒数第k个节点。关注要点链表头指针是否为空,若为空则直接返回回nullk是否为0,k为0也就是...原创 2019-03-29 22:27:44 · 201 阅读 · 0 评论 -
合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路两种解法:递归和非递归//递归 public ListNode merge(ListNode list1,ListNode list2){ if(list1 == null) return list2; else if(list2 == null) return...原创 2019-03-29 22:28:55 · 153 阅读 · 0 评论 -
复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解题思路public class RandomListNode{ int label; RandomListNode next = null; RandomL...原创 2019-03-29 22:32:55 · 107 阅读 · 0 评论 -
删除链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5解题思路首先添加一个头节点,以方便碰到第一个,第二个节点就相同的情况设置 first ,second 指针, first 指针指向当前确定不重复的那个节点,而se...原创 2019-03-29 22:37:04 · 134 阅读 · 0 评论 -
删除排序链表中重复的节点
题目描述给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。解题思路我们要删除节点i,先把i的下一个节点j的内容复制到i,然后把i的指针指向节点j的下一个节点。此时再删除节点j,其效果刚好是把节点i删除了。public ListNode deleteDuplication(ListNode pHead){ if(pHead == null || pHead.ne...原创 2019-03-29 22:42:53 · 338 阅读 · 0 评论 -
链表中环的入口结点
题目描述给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。解题思路一种方法是用 hashmap来存储和查找节点;另一种方法是双指针法。假设环长度为n,进入环之前结点个数为x,slow在环内走了k个结点,fast绕环走了m圈,则有2(x+k)=x+mn+k 可以得出x = mn - k。此时slow距入口结点还剩 n-k个结点,x=(m−1)n+n−k,即一个指针从...原创 2019-03-29 22:44:21 · 118 阅读 · 0 评论 -
两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。解题思路如果两个链表存在公共结点,那么它们从公共结点开始一直到链表的结尾都是一样的,因此我们只需要从链表的结尾开始,往前搜索,找到最后一个相同的结点即可。但是题目给出的单向链表,我们只能从前向后搜索,这时,我们就可以借助栈来完成。先把两个链表依次装到两个栈中,然后比较两个栈的栈顶结点是否相同,如果相同则出栈,如果不同,那最后相同的结点就是我们要...原创 2019-03-29 22:45:55 · 113 阅读 · 0 评论