链表每隔k个元素反转

题目描述

给定一个链表,每隔k个元素做一次反转。

Example: Inputs: 1->2->3->4->5->6->7->8->NULL and k = 3 Output: 3->2->1->6->5->4->8->7->NULL.

Inputs: 1->2->3->4->5->6->7->8->NULL and k = 5 Output: 5->4->3->2->1->8->7->6->NULL.

解析

我们在学习链表的创建的时候,有一种方法是头插法, 而我们解决 反转链表元素 的时候也会用这种方法。因此我们也借用这种方法,当我们反转k个元素的时候,我们在把指针从链表的头部移动到尾部 ,然后再用头插法在反转k个元素。依次就能进行局部反转。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

代码

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


typedef struct Node{
	int data;
	struct Node *next;
}node, *Link;

node *reverse(Link &L, int k){
	int j = 0;
	
	node *p = L, *q;
	q = new node;
	q->next = NULL;
	L = q;
	while(p){
		node *temp = p;
		p = p->next;
		
		temp->next = q->next;
		q->next = temp;
		j++;
		if(j%k == 0){
			while(q->next){
				q = q->next;
			}
		}
	}
	
	return L->next;
}


node *CreateL(Link &L, int n){  //  头插法建立一个链表。
	node *p = new node;
	p->next = NULL;
	
	for(int i=0;i<n;i++){
		node *temp = new node;
		cin>>temp->data;
		temp->next = p->next;
		p->next = temp;
	}
	L = p->next;
	return L;
}

void print(node *L){
	
	while(L){
		printf("%d ", L->data);
		L = L->next;
	}
	putchar('\n');
}


int main(){
	
	node *L;
	int n; cin>>n;
	L = CreateL(L, n);
	
	
	int k; cin>>k;
	puts("初始  的顺序:");   print(L);
	L = reverse(L, k);
	puts("倒叙后的顺序:"); print(L);
	
	return 0;
} 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值