首页 > 其他分享 >【OJ】K 个一组翻转链表

【OJ】K 个一组翻转链表

时间:2024-03-13 19:32:19浏览次数:27  
标签:node head cur list next 链表 new 翻转 OJ

题目
基本思路:用计数+栈实现分段,K个一组地翻转链表。

#include <bits/stdc++.h>
#include <stack>
using namespace std;

struct list_node {
  int val;
  struct list_node *next;
};

list_node *input_list() {
  int val, n;
  scanf("%d", &n);
  list_node *phead = new list_node();
  list_node *cur_pnode = phead;
  for (int i = 1; i <= n; ++i) {
    scanf("%d", &val);
    if (i == 1) {
      cur_pnode->val = val;
      cur_pnode->next = NULL;
    } else {
      list_node *new_pnode = new list_node();
      new_pnode->val = val;
      new_pnode->next = NULL;
      cur_pnode->next = new_pnode;
      cur_pnode = new_pnode;
    }
  }
  return phead;
}

list_node *reverse_knode(list_node *head1, int K) {
  if (K < 2 || !head1 || !head1->next) {
    return head1;
  }
  std::stack<list_node *> s;
  int cnt = 0;
  int cnt_interval = 0;
  list_node *last_tail = nullptr;
  list_node *cur_head = nullptr;
  list_node *cur = head1;
  list_node *new_head = nullptr;
  while (cur) {
    s.push(cur);
    cnt++;
    cur = cur->next;
    if (cnt == K) {
      cnt = 0;
      cnt_interval++;
      list_node *i_pre = s.top();
      s.pop();
      cur_head = i_pre;
      if (cnt_interval > 1) {
        last_tail->next = cur_head;
      } else {
        new_head = cur_head;
      }
      while (!s.empty()) {
        list_node *i_cur = s.top();
        s.pop();
        i_pre->next = i_cur;
        i_pre = i_cur;
      }
      last_tail = i_pre;
      last_tail->next = cur;
    }
  }
  return new_head;
}

void print_list(list_node *head) {
  while (head != NULL) {
    printf("%d ", head->val);
    head = head->next;
  }
  puts("");
}

int main() {
  list_node *head = input_list();
  int K;
  scanf("%d", &K);
  list_node *new_head = reverse_knode(head, K);
  print_list(new_head);
  return 0;
}

测试,

g++ ./ReverseKNode.cpp
./a.out
5
1
2
3
4
5
2

标签:node,head,cur,list,next,链表,new,翻转,OJ
From: https://blog.csdn.net/CSUzhangpeike/article/details/136689021

相关文章

  • 【OJ】猫狗队列
    猫狗队列思路用两个队列分别保存猫、狗,用各个的入队计数判断任一出队时选择哪一种,指定类别出队则直接从相应队列出队。实现Python输入测试testCatDogQ.txt65adddog29addcat9adddog40adddog38addcat32adddog20addcat45pollAlladdcat37isDogEm......
  • 《牛客》-D小红数组操作 (链表)
    思路:采用链表进行动态维护即可我们采用map集合来模拟链表结构(用结构体也是可以的)就是输出需要一点点思考.ACcode:#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongmap<int,int>l,r;intq,x,y,op,k;voidsolve(){ cin>>q; while(q--){ cin>>o......
  • 【easy52pojie】一款方便看吾爱论坛帖子的爬虫程序
    【easy52pojie】一款方便看吾爱论坛帖子的爬虫程序众所周知吾爱论坛一页最多显示十来条回帖,且间隔很大,每页的信息密度太低了。在帖子很庞大的情况下,一页一页翻页,着实有点痛苦。故简单敲敲代码,使用requestxpath技术做了一个论坛帖子回复查看器,名称为easy52pojie,运行代码即可导出......
  • 【持续更新】华为 OD 机试 C卷抽中题库清单(全真题库)含考点说明以及在线OJ
    华为OD机考:统一考试C卷+D卷+B卷+A卷2023年11月份,华为官方已经将华为OD机考:OD统一考试(A卷/B卷)切换到OD统一考试(C卷)和OD统一考试(D卷)。目前在考C卷,经过两个月的收集整理,C卷真题已基本整理完毕抽到原题的概率为2/3到3/3,也就是最少抽到两道原题。请注意:大家刷......
  • 142. 环形链表 IIc
    /***Definitionforsingly-linkedlist.*structListNode{*intval;*structListNode*next;*};*/structListNode*detectCycle(structListNode*head){structListNode*slow=head,*fast=head;while(fast&&fast->next......
  • Idea Project :一个正确配置 (调整Maven服务器后)
    配置Maven环境(FileSettings)MavenMavenrunnerJavaComplier配置ProjectStructureSDKProjectModuleuploading-image-281165.png......
  • JS 链表 - 笔记
    代码:classListNode{/***@constructor*@param{number}val*@param{ListNode}next*/constructor(val,next){this.val=(val===undefined?0:val);this.next=(next===undefined?null:next);......
  • QOJ杂题合集
    QOJ杂题合集QOJ#151.NiceLinesQOJ#838.HorribleCyclesQOJ#894.LongestLooseSegmentQOJ#895.Color给定一个有\(n\)个节点的无向完全图\(G\),每条边都被染成了\(m\)种颜色中的一种,颜色编号为\(1\simm\)。我们称一个无向完全图合法,当且仅当对于\(\forallx......
  • 东华OJ 进阶题30 盾神与砝码称重
    问题描述:有一天,他在宿舍里无意中发现了一个天平!这个天平很奇怪,有n个完好的砝码,但是没有游码。盾神为他的发现兴奋不已!于是他准备去称一称自己的东西。他准备好了m种物品去称。神奇的是,盾神一早就知道这m种物品的重量,他现在是想看看这个天平能不能称出这些物品出来。但是......
  • K 个一组翻转链表
    题目:structListNode{intval;ListNode*next;ListNode():val(0),next(nullptr){}ListNode(int_val):val(_val),next(nullptr){}ListNode(int_val,ListNode*_next):val(_val),next(_next){}};classSolution{public:ListNod......