[Leedcode][JAVA][第25题][K个一组反转链表][链表][递归]
【問(wèn)題描述】[第25題][K個(gè)一組反轉(zhuǎn)鏈表][困難]
時(shí)間復(fù)雜度:O(N^2) 空間復(fù)雜度:O(1) ```java 給你一個(gè)鏈表,每 k 個(gè)節(jié)點(diǎn)一組進(jìn)行翻轉(zhuǎn),請(qǐng)你返回翻轉(zhuǎn)后的鏈表。k 是一個(gè)正整數(shù),它的值小于或等于鏈表的長(zhǎng)度。如果節(jié)點(diǎn)總數(shù)不是 k 的整數(shù)倍,那么請(qǐng)將最后剩余的節(jié)點(diǎn)保持原有順序。示例:給你這個(gè)鏈表:1->2->3->4->5當(dāng) k = 2 時(shí),應(yīng)當(dāng)返回: 2->1->4->3->5當(dāng) k = 3 時(shí),應(yīng)當(dāng)返回: 3->2->1->4->5說(shuō)明:你的算法只能使用常數(shù)的額外空間。 你不能只是單純的改變節(jié)點(diǎn)內(nèi)部的值,而是需要實(shí)際進(jìn)行節(jié)點(diǎn)交換。【解答思路】
1. 圖解大法
1.鏈表分區(qū)為已翻轉(zhuǎn)部分+待翻轉(zhuǎn)部分+未翻轉(zhuǎn)部分
2.每次翻轉(zhuǎn)前,要確定翻轉(zhuǎn)鏈表的范圍,這個(gè)必須通過(guò) k 此循環(huán)來(lái)確定
3.需記錄翻轉(zhuǎn)鏈表前驅(qū)和后繼,方便翻轉(zhuǎn)完成后把已翻轉(zhuǎn)部分和未翻轉(zhuǎn)部分連接起來(lái)
4.初始需要兩個(gè)變量 pre 和 end,pre 代表待翻轉(zhuǎn)鏈表的前驅(qū),end 代表待翻轉(zhuǎn)鏈表的末尾
5.經(jīng)過(guò)k此循環(huán),end 到達(dá)末尾,記錄待翻轉(zhuǎn)鏈表的后繼 next = end.next
6.翻轉(zhuǎn)鏈表,然后將三部分鏈表連接起來(lái),然后重置 pre 和 end 指針,然后進(jìn)入下一次循環(huán)
7.特殊情況,當(dāng)翻轉(zhuǎn)部分長(zhǎng)度不足 k 時(shí),在定位 end 完成后,end==null,已經(jīng)到達(dá)末尾,說(shuō)明題目已完成,直接返回即可
時(shí)間復(fù)雜度為 O(n*K) 最好的情況為 O(n) 最差的情況未 O(n^2)
空間復(fù)雜度為 O(1)
時(shí)間復(fù)雜度:O(N) 空間復(fù)雜度:O(1)
2. 遞歸
public ListNode reverseKGroup(ListNode head, int k) {if (head == null || head.next == null) {return head;}ListNode tail = head;for (int i = 0; i < k; i++) {//剩余數(shù)量小于k的話,則不需要反轉(zhuǎn)。if (tail == null) {return head;}tail = tail.next;}// 反轉(zhuǎn)前 k 個(gè)元素ListNode newHead = reverse(head, tail);//下一輪的開(kāi)始的地方就是tailhead.next = reverseKGroup(tail, k);return newHead;}/*左閉又開(kāi)區(qū)間*/private ListNode reverse(ListNode head, ListNode tail) {ListNode pre = null;ListNode next = null;while (head != tail) {next = head.next;head.next = pre;pre = head;head = next;}return pre;}【總結(jié)】
1.鏈表題目多畫圖 ,畫圖大法好
2.整條鏈表翻轉(zhuǎn)
例子: head: 1->2->3->4public ListNode reverse(ListNode head) {//單鏈表為空或只有一個(gè)節(jié)點(diǎn),直接返回原單鏈表if (head == null || head.next == null){return head;}//前一個(gè)節(jié)點(diǎn)指針ListNode preNode = null;//當(dāng)前節(jié)點(diǎn)指針ListNode curNode = head;//下一個(gè)節(jié)點(diǎn)指針ListNode nextNode = null;while (curNode != null){nextNode = curNode.next;//nextNode 指向下一個(gè)節(jié)點(diǎn),保存當(dāng)前節(jié)點(diǎn)后面的鏈表。curNode.next=preNode;//將當(dāng)前節(jié)點(diǎn)next域指向前一個(gè)節(jié)點(diǎn) null<-1<-2<-3<-4preNode = curNode;//preNode 指針向后移動(dòng)。preNode指向當(dāng)前節(jié)點(diǎn)。curNode = nextNode;//curNode指針向后移動(dòng)。下一個(gè)節(jié)點(diǎn)變成當(dāng)前節(jié)點(diǎn)}return preNode;}3.常規(guī)解法
將鏈表指針全部復(fù)制到數(shù)組進(jìn)行調(diào)整后再連接的算法
轉(zhuǎn)載鏈接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/tu-jie-kge-yi-zu-fan-zhuan-lian-biao-by-user7208t/
轉(zhuǎn)載鏈接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/di-gui-java-by-reedfan-2/
總結(jié)
以上是生活随笔為你收集整理的[Leedcode][JAVA][第25题][K个一组反转链表][链表][递归]的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 可任意设置时间的ppt倒计时软件
- 下一篇: [计算机网络][总结][常见问题][TC