日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Leetcode 25.K个一组翻转链表

發布時間:2025/5/22 编程问答 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode 25.K个一组翻转链表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

難度:困難

頻率:185

**題目:**給你一個鏈表,每K個節點一組進行翻轉,清你返回翻轉后的鏈表。
K是一個正整數,它的值小于或等于鏈表的長度。
如果節點總數不是K的整數倍,那么請將最后勝于的節點保持原有順序。
進階:

  • 你可以設計一個只使用常數額外空間的算法來解決此問題嗎?
  • 你不能知識單純的改變節點內部的值,而是需要實際進行節點交換。

    題目類型:鏈表翻轉
    解題方法:當成多個鏈表翻轉
    解題思路:
    (思考:)1.如果K剛好等于鏈表長度,即剛好完成一此鏈表翻轉。
    2.如果K大于鏈表長度,即不翻轉。
    3.如果K小于鏈表長度,即完成 abs(鏈表長度/K)次翻轉。
    3.1 那多次翻轉,需要考慮什么問題?假設存在兩次翻轉, 那第一次翻轉跟第二次翻轉 最后的結果要怎么連接在一起? —>故需要用一個指針記錄第二次翻轉的head節點。
    3.2那么我怎么知道判斷剩下的是否大于K,是否要翻轉?—>如果每翻轉一個節點記錄一次的話,最后如果小于K,不需要翻轉,也翻轉了。所以需要先計數,再翻轉。可以用指針記錄。 —>結合3.1里記錄下次的head。可以先用一個指針移動K次,如果指針不為空,即可以進行翻轉。

一次翻轉需要兩個移動指針和一個head指針,判斷是否大于K需要1個指針。

PS:
1.主函數里需要3個指針,pre(記錄上一段的尾) start(記錄下一段的head) end(判斷K)。
2.翻轉函數里 需要3個指針,一個Pre 一個Cur 一個head。

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;pre.next = reverse(start); //start是每段K的head指針start.next = next;pre = start;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; }

總結

以上是生活随笔為你收集整理的Leetcode 25.K个一组翻转链表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。