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