【LeetCode】反轉鏈表 II

解題思路

先移動節點到要反轉的地方,反轉鏈表就比較簡單了,然後把當前節點和反轉的鏈表以及後面的第一個節點的串起來即可

代碼

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
        ListNode ans = new ListNode(0);
        ans.next = head;
        // 開始移動node
        ListNode node = ans;
        for(int i = 1;i < m;i++){
            node = node.next;
        }

        //反轉開始結點
        ListNode newHead = node.next;
        ListNode preNode = null;
        ListNode nextNode = null;

        for(int i = 0;i < n - m + 1;i++){
            nextNode = newHead.next;
            newHead.next = preNode;
            preNode = newHead;
            newHead = nextNode;
        }
        
        //反轉完畢,nextNode就是反轉部分的後一個
        //這兩步不能反過來
        node.next.next = nextNode;
        // preNode就是反轉完成後的頭節點
        node.next = preNode;
        
        return ans.next;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章