1. 程式人生 > >Java中連結串列相關演算法

Java中連結串列相關演算法

如下為連結節點,後續都用此表示連結節點

class ListNode{
        int value;
        ListNode next;
        public ListNode(int value,ListNode next){
        }
    }

1、連結串列的反轉方法

/***
     * 迴圈方法實現連結串列反轉
     * @param head
     * @return
     */
    public ListNode reverseListNodeWithIterative(ListNode head){
        if
(head ==null || head.next==null){ return head; } ListNode pre = null; ListNode cur = head; while(cur!=null){ ListNode next = cur.next; cur.next = pre; pre = cur; cur = next; } return pre; }
 /***
     * 遞迴方法實現連結串列反轉
     * @param head
     * @return
     */
    public ListNode reverseListNodeWithRecursive(ListNode head){
        if(head==null || head.next==null){
            return head;
        }
        ListNode nextNode = head.next;
        ListNode newHead = reverseListNodeWithRecursive(head);
        nextNode.next = head;
        head.next = null
; return newHead; }

2.找出連結串列的中間節點

/***
     * 尋找連結串列的中間節點
     * @param head
     * @return
     */
    public ListNode findMiddleNode(ListNode head){
        if(head==null){
            return head;
        }
        ListNode slow = head,fast = head;
        if(fast.next!=null && fast.next.next!=null){
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }

3.用快慢指標判斷連結串列是否有環

/***
     * 用快慢指標判斷連結串列是否有環
     * @param head
     * @return
     */
    public boolean isCircleLinkedListNode(ListNode head){
        if(head == null){
            return false;
        }
        ListNode slow = head,fast = head;
        if(fast.next !=null && fast.next.next!=null){
            slow =slow.next;
            fast = fast.next.next;
            if(slow == fast){
                return true;
            }
        }
        return false;
    }

4.將某個元素插入排序連結串列中

/***
     * 將某個元素插入排序連結串列中
     * @param head
     * @param target
     * @return
     */
    public ListNode insetNode(ListNode head,int target){
        ListNode targetNode = new ListNode(target,null);
        if(head == null || target<=head.value){
            targetNode.next = head;
            return targetNode;
        }
        ListNode cur = head;
        while(cur!=null){
            if(cur.next ==null || target>=cur.next.value){
                targetNode.next = cur.next;
                cur.next = targetNode;
            }
            cur = cur.next;
        }
        return head;
    }