[入门leetcode]数组&&链表

133 阅读1分钟

1.1、[206]. Reverse Linked List

Reverse a singly linked list.

Example:

Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL

非递归:

{
        if(null == head || null == head.next){
            return head;
        }

        ListNode p1 = head;
        ListNode p2 = p1.next;
        ListNode p3 = p2.next;

        p1.next = null;
        
        while(null != p3){
            p2.next = p1;
            p1 = p2;
            p2 = p3;
            p3 = p3.next;
        }

        p2.next = p1;
        return p2;
    }

递归:

    public static ListNode reverseList1(ListNode head) {
        if(null == head || null == head.next){
            return head;
        }

        ListNode newHead = reverseList1(head.next);
        head.next.next = head;
        head.next = null;
        return newHead;

    }

1.2、[92]. Reverse Linked List II

Reverse a linked list from position m to n. Do it in one-pass.
Note: 1 ≤ m ≤ n ≤ length of list.
Example:
Input: 1->2->3->4->5->NULL, m = 2, n = 4
Output: 1->4->3->2->5->NULL

    public static ListNode reverseBetween(ListNode head, int m, int n) {

        ListNode curNode = head;

        //m前面一个节点
        ListNode preNode = head;
        for (int i = 1; i <= m - 1; i++) {
            preNode = curNode;
            curNode = curNode.next;
        }


        ListNode beforePre = preNode;

        ListNode beforeCur = curNode;

        preNode.next = null;


        for (int j = m; j <= n; j++) {
            if(null != curNode){
                ListNode t = curNode.next;
                curNode.next = preNode;
                preNode = curNode;
                curNode = t;
            }
        }

        if(1 == m){
            beforeCur.next = curNode;
            return preNode;
        } 
        
        beforePre.next = preNode;
        beforeCur.next = curNode;

        return head;

    }

二、swap-nodes-in-pairs

三、linked-list-cycle

四、linked-list-cycle-ii

五、reverse-nodes-in-k-group