力扣【25】K个一组翻转链表(字节跳动面试题)
生活随笔
收集整理的這篇文章主要介紹了
力扣【25】K个一组翻转链表(字节跳动面试题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:
給你一個鏈表,每?k?個節點一組進行翻轉,請你返回翻轉后的鏈表。
k?是一個正整數,它的值小于或等于鏈表的長度。
如果節點總數不是?k?的整數倍,那么請將最后剩余的節點保持原有順序。
進階:
你可以設計一個只使用常數額外空間的算法來解決此問題嗎?
你不能只是單純的改變節點內部的值,而是需要實際進行節點交換。
?
示例 1:
輸入:head = [1,2,3,4,5], k = 2
輸出:[2,1,4,3,5]
示例 2:
輸入:head = [1,2,3,4,5], k = 3
輸出:[3,2,1,4,5]
示例 3:
輸入:head = [1,2,3,4,5], k = 1
輸出:[1,2,3,4,5]
示例 4:
輸入:head = [1], k = 1
輸出:[1]
題解:
?
package test; class ListNode {int val;ListNode next;ListNode(int x) { val = x; } } class Solution {public ListNode reverseKGroup(ListNode head, int k) {ListNode dummy = new ListNode(0);dummy.next = head;ListNode pre = dummy;ListNode end = dummy;while (end.next != null) {for (int i = 0; i < k && end != null; i++) {end = end.next;}if (end == null)break;ListNode start = pre.next;ListNode next = end.next;end.next = null;//先斷開與后面K個的連接pre.next = reverse(start);//這里pre就是dummy,所以下面可以直接返回dummy.nextstart.next = next;//翻轉pre = start;//pre和end又到一塊了,指向下一組的前一個end = pre;}return dummy.next;}private ListNode reverse(ListNode head) {ListNode pre = null;ListNode curr = head;while (curr != null) {ListNode next = curr.next;curr.next = pre;pre = curr;curr = next;}return pre;} }public class Main{public static void main (String []args){ListNode l1 = new ListNode(1);//@466ListNode l2 = new ListNode(2);//@467ListNode l3 = new ListNode(3);//@468ListNode l4 = new ListNode(4);//@469ListNode l5 = new ListNode(5);//@470l1.next = l2;l2.next = l3;l3.next = l4;l4.next = l5;Solution p = new Solution();ListNode b = p.reverseKGroup(l1, 3);while (b != null){System.out.print("->"+b.val);b = b.next;}} }reverse函數的過程如下所示:
?
總結
以上是生活随笔為你收集整理的力扣【25】K个一组翻转链表(字节跳动面试题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【ubuntu】在虚拟机中如何给ubun
- 下一篇: 文件夹下图片批处理(图片名不要求连续,批