链表操作
Green__Arrow
机会是留给有准备的人
展开
-
从尾到头打印链表
思路:链表遍历是从头到尾,而打印需要从尾到头,再不更改链表的结构情况下,发现栈的“先入后出”特点正好符合要求。//定义链表原创 2015-05-02 17:11:12 · 585 阅读 · 0 评论 -
链表中倒数第k个结点
定义两个指针,求倒数第k个结点,相当于第一个指针向前移动k-1次,第k次时,第二个指针和第一个指针同时向前移动,指导第一个指针到达最后一个,此时第二个指针的结点就是所要找的结点。(已测)//定义一个链表public class ListNote {private ListNote NextNote;private int value;public ListNote()原创 2015-04-19 19:52:25 · 606 阅读 · 0 评论 -
反转链表
思路:定义四个结点,前结点preNode,当前结点node,下一个结点nextNode,翻转结点reverseNode。遍历结点,设置node结点下一个结点为preNode,把当前结点node赋给preNode,把nextNode赋给node public static ListNote reverseListNode(ListNote headNode) { if(headNod原创 2015-05-17 16:01:54 · 1036 阅读 · 0 评论 -
找出链表的中间结点
思路:定义两个快慢指针,快指针一次走两步,慢指针一次走一步,当快指针到达尾结点时,慢指针刚好为中间结点,这里需要区分两种情况,当链表中结点数为奇数时,慢指针刚好到达中间结点;当链表中结点数为偶数时候,中间结点有两个,返回一个。public static ListNote findMidNode(ListNote headNote){ if(headNote==null){原创 2015-05-17 10:32:56 · 1390 阅读 · 0 评论 -
删除链表中重复的结点JAVA
思路:定义四个结点,前结点prenode,当前结点node,下一个结点nextnode,删除结点delnode,在遇到删除结点时候要保证prenode连接上nextnode,防止断裂情况。public static void deleteDuplication(ListNote root){ if(root==null){ return; }原创 2015-06-17 14:59:13 · 2310 阅读 · 1 评论 -
合并两个排序的链表
将两个递增的链表合并为一个递增的新链表。 思路:比较两个递增的链表的头结点大小,假设链表1的头结点的值小,则链表1的头结点为新链表的头结点,接着继续合并,接着比较链表1的第二个结点与链表2的头结点比较,两个链表还是有序的递增序列,重复上述步骤,最后生成一新的递增链表。 public static ListNote mergeListNode(ListNote head1Node,ListNo原创 2015-05-19 14:28:34 · 797 阅读 · 0 评论 -
链表中环的入口结点
思路:先用一个快慢指针,找到两者相遇结点,如果有环,结点一定在环中;接着求出环中结点数目n;然后用两个结点,第一个结点先走n步,第二个结点也开始走,相遇即为入口结点./** * 得到环中相遇点 * @param root * @return */ public static ListNote meetNode(ListNote root){原创 2015-08-26 16:17:14 · 635 阅读 · 0 评论 -
两个链表的第一个公共结点
思路:获取两个链表的长度,求的长度差n,让长链表先遍历n次,然后长链表和短链表同时遍历,当长链表和短链表相等时,即为第一公共结点。(O(m1+m2))public class FindFirstComNode { public static ListNote findFirstComNode(ListNote root1,ListNote root2){ if(root1==n原创 2015-08-26 16:03:41 · 456 阅读 · 0 评论