目录
题目
设将n(n>1)个整数存放到不带头结点的单链表L中,设计算法将L中保存的序列循环右移动k(0<k<n)个位置。例如,若k=1,则将链表{0,1,2,3}变为{3,0,1,2}。
核心代码
//向右移动k位
Node* Converse(Node **L,int k){
int n=1;
Node *p=*L;
while(p->next!=NULL){
p=p->next;
n++;
}
p->next=*L;
for(int i=0;i<n-k;i++){
p=p->next;
}
*L=p->next;
p->next=NULL;
return *L;
}
完整代码
//不带头结点,并且向右移动k位
#include<stdio.h>
#include<stdlib.h>
//定义链表节点
typedef struct Node
{
int data;
struct Node* next;
}Node;
//创建新节点
Node* createNode(int data){
Node* newNode=(Node *)malloc(sizeof(Node));
newNode->data=data;
newNode->next=NULL;
return newNode;
}
//插入节点到链表的末尾
void insert(Node **L,int data){
Node* newNode=createNode(data);
if(*L==NULL){
*L=newNode;
return;
}
Node* temp=*L;
while(temp->next!=NULL){
temp=temp->next;
}
temp->next=newNode;
}
//向右移动k位
Node* Converse(Node **L,int k){
int n=1;
Node *p=*L;
while(p->next!=NULL){
p=p->next;
n++;
}
p->next=*L;
for(int i=0;i<n-k;i++){
p=p->next;
}
*L=p->next;
p->next=NULL;
return *L;
}
//打印链表
void printList(Node* node){
while(node!=NULL){
printf("Data:%d\n",node->data);
node=node->next;
}
}
int main(){
Node* L=NULL;
insert(&L,1);
insert(&L,2);
insert(&L,3);
insert(&L,4);
printf("初始链表:\n");
printList(L);
Converse(&L,2);
printf("变化后的链表:\n");
printList(L);
return 0;
}
示例
初始链表:
Data:1
Data:2
Data:3
Data:4
变化后的链表:
Data:3
Data:4
Data:1
Data:2