首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

LeetCode Rotate List:鏈表右旋 K 位雙指針法

     編輯:關於C++

問題描述

給定單鏈表頭節點 head 和非負整數 k,將鏈表向右旋轉 k 位。即斷開倒數第 k 個節點後的部分接到頭部。k 可能大於鏈表長度。

算法:快慢指針(尺取法)

  1. 先遍歷鏈表求長度 len,同時尾節點 tail 記錄。
  2. k %= len;若 k==0 直接返回 head。
  3. 快指針 fast 先走 k 步。
  4. 慢指針 slow 從 head 出發,fast 和 slow 同步前進,直到 fast->next == nullptr。此時 slow 指向新尾節點(倒數第 k+1 個)。
  5. 新頭 newHead = slow->next;slow->next = nullptr;tail->next = head;返回 newHead。

Java 代碼


public ListNode rotateRight(ListNode head, int k) {
    if(head==null || head.next==null) return head;
    ListNode fast=head, slow=head;
    int len=0; ListNode tail=head;
    while(tail!=null){ len++; if(tail.next==null) break; tail=tail.next; }
    k %= len; if(k==0) return head;
    for(int i=0;i

關鍵點

  • 取模處理 k ≥ len。
  • 雙指針一次遍歷定位斷點,無需計算具體位置索引。
  • 尾節點連接原頭形成環再斷開,邏輯清晰。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved