1. 程式人生 > 其它 >92.反轉連結串列 II

92.反轉連結串列 II

技術標籤:# 連結串列專題java連結串列leetcode面試演算法

92. 反轉連結串列 II

反轉從位置 mn 的連結串列。請使用一趟掃描完成反轉。

說明:
1 ≤ mn ≤ 連結串列長度。

示例:

輸入: 1->2->3->4->5->NULL, m = 2, n = 4
輸出: 1->4->3->2->5->NULL

思路:

先找到第m個結點的前一個結點pre,用於連線反轉部分的首結點,它的下一節點就是206題反轉連結串列中的tail,用於連線反轉部分和未反轉部分。各關鍵結點如圖所示。

在這裡插入圖片描述

反轉後各關鍵結點位置如下圖,可以看到pre

tail的指向一直沒有變過,改變的是pre.nexttail.next,用於輔助連線過程。

在這裡插入圖片描述

Java程式碼

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution { public ListNode reverseBetween(ListNode head, int m, int n) { //思路與206題反轉連結串列類似,只是這裡將第m-1個位置換成了那題的dummy if(head == null || head.next == null) return head; //建立虛擬頭結點,方便對所有結點的操作統一 ListNode dummy = new ListNode(-1); dummy.next = head; //本題使用頭插法的首結點應該為第m-1個結點
ListNode pre = dummy; for(int i = 0;i < m - 1;i++){ pre = pre.next; } //接下來的操作用206題一致 ListNode tail =pre.next; ListNode cur = tail.next; //頭插後面的 n - m個結點到pre之後即可 for(int i = m;i < n;i++){ ListNode nxt = cur.next; cur.next = pre.next; pre.next = cur; tail.next = nxt; cur = nxt; } return dummy.next; } }

在這裡插入圖片描述