程序在C ++中按k个位置旋转链接列表

假设我们有一个链表。我们必须将列表向右旋转k个位置。k的值为正。因此,如果列表类似于[1-> 2-> 3-> 4-> 5-> NULL],并且k = 2,则输出将为[4-> 5-> 1-> 2-> 3- > NULL]

让我们看看步骤-

  • 如果列表为空,则返回null

  • len:= 1

  • 创建一个名为tail:= head的节点

  • 而尾巴的下一个不为null

    • len增加1

    • 尾巴:=尾巴的下一个

  • 尾巴的下一个:=头

  • k:= k mod len

  • newHead:= null

  • 对于i:= 0至len − k

    • 尾巴:=尾巴的下一个

  • newHead:=尾巴的下一个

  • 尾巴的下一个:= null

  • 返回newHead

让我们看下面的实现以更好地理解-

示例

#include <bits/stdc++.h>

using namespace std;

class ListNode{

   public:

   int val;

   ListNode *next;

   ListNode(int data){

      val = data;

      next = NULL;

   }

};

ListNode *make_list(vector<int> v){

   ListNode *head = new ListNode(v[0]);

   for(int i = 1; i<v.size(); i++){

      ListNode *ptr = head;

      while(ptr->next != NULL){

         ptr = ptr->next;

      }

      ptr->next = new ListNode(v[i]);

   }

   return head;

}

void print_list(ListNode *head){

   ListNode *ptr = head;

   cout << "[";

   while(ptr->next){

      cout << ptr->val << ", ";

      ptr = ptr->next;

   }

   cout << "]" << endl;

}

class Solution {

   public:

   ListNode* rotateRight(ListNode* head, int k) {

      if(!head) return head;

      int len = 1;

      ListNode* tail = head;

      while(tail->next){

         len++;

         tail = tail->next;

      }

      tail->next = head;

      k %= len;

      ListNode* newHead = NULL;

      for(int i = 0; i < len - k; i++){

         tail = tail->next;

      }

      newHead = tail->next;

      tail->next = NULL;

      return newHead;

   }

};

main(){

   Solution ob;

   vector<int> v = {1,2,3,4,5,6,7,8,9};

   ListNode *head = make_list(v);

   print_list(ob.rotateRight(head, 4));

}

输入项

[1,2,3,4,5,6,7,8,9], 4

输出结果

[6, 7, 8, 9, 1, 2, 3, 4, ]

以上是 程序在C ++中按k个位置旋转链接列表 的全部内容, 来源链接: utcz.com/z/326792.html

回到顶部