数据结构与算法之美——链表操作

链表定义

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;

}

 

posted @ 2019-02-25 11:19  一只橙子子子  阅读(112)  评论(0编辑  收藏  举报