面试算法TOP101——反转链表

111 阅读1分钟

反转链表

链表的数据结构如下:

public class ListNode {
    int val;
    ListNode next = null;
    ListNode(int val) {
        this.val = val;
    }
}

实现链表的反转可以借助三个指针pre、cur、temp

public ListNode ReverseList(ListNode head) {
        ListNode cur = head;
        ListNode pre = null;
        while(cur != null) {
            ListNode temp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }

而局部反转可以

public ListNode reverseBetween (ListNode head, int m, int n) {
        //当m为1时,如果不设置res而是使用pre=null,会使temp.next=pre.next没有指向
        ListNode res = new ListNode(-1);
        res.next = head;
        ListNode cur = head;
        ListNode pre = res;
        for (int i = 1; i < m; i++) {
            pre = cur;
            cur = cur.next;
        }
        
        for (int i = m; i < n; i++) {
            ListNode temp = cur.next;
            //保存cur.next指针指向的位置
            cur.next = temp.next;
            temp.next = pre.next;
            pre.next = temp;
        }
        return res.next;
    }