链表定义
public class ListNode { int data; ListNode next; ListNode(int data){ this.data = data; } }
1.单链表反转
public static ListNode listReverse(ListNode head){ ListNode pre = null; ListNode cur = head; ListNode temp = cur.next; while(true){ cur.next = pre; pre = cur; cur = temp; if(cur == null) return pre; temp = cur.next; } }
2.判断是否有环,若有环,返回环入口结点
public static ListNode hiveLoop(ListNode head){ if(head == null) return null; ListNode p = head; ListNode q = head; while (q != null && q.next != null){ p = p.next; q = q.next.next; if(p == q) break; } q = head; while (q != p){ q = q.next; p = p.next; } return p; }
3.有序链表的合并
public static ListNode listMerge(ListNode list1, ListNode list2){ if(list1 == null) return list2; if(list2 == null) return list1; ListNode list, current; list = current = null; while(list1 != null && list2 != null){ if(list1.data <= list2.data){ if(list == null) list = current = list1; else{ current.next = list1; current = current.next; } list1 = list1.next; }else { if(list == null) list = current = list2; else { current.next = list2; current = current.next; } list2 = list2.next; } } if(list1 == null) current.next = list2; if(list2 == null)current.next = list1; return list; }
4.删除链表倒数第k个结点
public ListNode FindKthToTail(ListNode head,int k) { ListNode p, q; p = q = head; int i; for(i = 0; p != null; i++){ if(i >= k) q = q.next; p = p.next; } return i < k ? null : q; }
5.求链表的中间结点
public static ListNode FindMidNode(ListNode head){ if(head == null) return null; ListNode slow = head; ListNode fast = head; while(fast != null && fast.next != null){ slow = slow.next; fast = fast.next.next; } return slow; }