標籤:單鏈表 演算法 面試 java
【092-Reverse Linked List II(反轉單鏈表II)】
【LeetCode-面試演算法經典-Java實現】【所有題目目錄索引】
原題
Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given 1->2->3->4->5->NULL, m = 2 and n = 4,
return 1->4->3->2->5->NULL.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
題目大意
給定一個單鏈表,將第m到第n個之間的元素進行轉。
給定的n和m都是合法的,使用原地方法進行解決(使用常量輔助空間)
解題思路
先找到第一個要反轉的元素的前驅(prev),再計算要進行反轉的元素個數,對元素進行頭插法,插在prev後面,同時保持鏈表不斷開。
代碼實現
鏈表結點類
public class ListNode { int val; ListNode next; ListNode(int x) { val = x; }}
演算法實作類別
public class Solution { public ListNode reverseBetween(ListNode head, int m, int n) { ListNode root = new ListNode(0); ListNode p = root; root.next = head; for (int i = 1; i < m && p != null; i++) { p = p.next; } if (p != null) { ListNode q = p.next; ListNode r; // 如果m為負數就認為是從第一個開始交換 if (m < 1) { m = 1; } n = n - m + 1; // n為要換的結點數目 // 有兩個結點時才要使用尾插法,尾插的個數為n-1 for (int i = 1; i < n && q.next != null ; i++) { // 為要進行尾插的結點 r = q.next; // 在q結點的後面進行尾插操作 q.next = r.next; r.next = p.next; p.next = r; } head = root.next; } return head; }}
評測結果
點擊圖片,滑鼠不釋放,拖動一段位置,釋放後在新的視窗中查看完整圖片。
特別說明
歡迎轉載,轉載請註明出處【http://blog.csdn.net/derrantcm/article/details/47310547】
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
【LeetCode-面試演算法經典-Java實現】【092-Reverse Linked List II(反轉單鏈表II)】