LeetCode每日一題5月16日 LeetCode25,k個一組翻轉鏈表

題目描述

給你一個鏈表,每 k 個節點一組進行翻轉,請你返回翻轉後的鏈表。

k 是一個正整數,它的值小於或等於鏈表的長度。

如果節點總數不是 k 的整數倍,那麼請將最後剩餘的節點保持原有順序。

說明:

你的算法只能使用常數的額外空間。
你不能只是單純的改變節點內部的值,而是需要實際進行節點交換。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group

示例:

給你這個鏈表:1->2->3->4->5

當 k = 2 時,應當返回: 2->1->4->3->5

當 k = 3 時,應當返回: 3->2->1->4->5

解題思路:

先求出鏈表長度,計算出鏈表最多有幾個k組,

然後依次翻轉

pre   cur nextnode .......
  需要翻轉的k段

這裏需要特別注意:如何做到不斷鏈翻轉

額外引入pre節點

nextnode = cur->next;
cur->next = nextnode->next;
nextnode->next = pre->next;
pre->next = nextnode;

完整代碼如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        int len = 0;
        ListNode *tmp = new ListNode(0);
        ListNode *prev = tmp;
        ListNode *cur=head;
        ListNode *nextnode;
        tmp->next = head;
        while(head){
            len++;
            head = head->next;
        }
        head = tmp->next;
        int cnt = len/k;
        if(cnt==0) return head;
        for(int i=0;i<cnt;i++){
            for(int j=0;j<k-1;j++){
                nextnode = cur->next;
                cur->next = nextnode->next;
                nextnode->next = prev->next;
                prev->next = nextnode;
                
            }
            prev = cur;
            cur = prev->next;
        }
        return tmp->next;
    }
};


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章