头文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#include<time.h>
节点结构体
#define TYPE int
typedef struct Node
{
TYPE data;
struct Node* next;
}Node;
创造一个节点
Node* creat_node(TYPE val)
{
Node* node = malloc(sizeof(Node));
node->data = val;
node->next = NULL;
return node;
}
头添加、尾添加
void add_head_list(Node* head,TYPE val)
{
Node* node = creat_node(val);
node->next = head->next;
head->next = node;
}
void add_tail_list(Node* head,TYPE val)
{
Node* node =creat_node(val);
Node* tail =head;
while(NULL !=tail->next) tail=tail->next;
tail->next=node;
}
部分逆序函数
Node* reverse_list(Node* head, int begin, int end)
{
Node* n1 = head;
Node* pre = NULL; //beginq前一个节点
Node* to = NULL;//end后一个节点
int len = 0;
while(NULL != n1)
{
if(len == begin-1)
{
pre = n1; //找到则记录节点
}
if(len == end+1)
{
to = n1;//找到则记录节点
}
len ++;
n1 = n1->next; // 查询下一个
}
//重赋值n1
if(NULL == pre)
{
n1 = head; //若前一个节点为空,则n1设为头节点
}
else
{
n1 = pre->next;//若前一个节点不为空,则n1设为begin节点
}
Node* n2 = n1->next;//指向下一个节点
n1->next = to; //将n1的下一个节点设置为end的下一个节点
Node* n3 = NULL;
while(to != n2)
{
n3 = n2->next;
n2->next = n1;
n1 = n2;
n2 = n3;
} //部分逆序
if(pre != NULL)
{
pre->next = n1;
return head; //判断头节点是否需要更换
}
return n1;
}
main函数测试
int main()
{
Node list = {};
for(int i=1; i<7; i++)
{
int num = rand()%100;
add_tail_list(&list,i);
}
show_list(&list);
puts("");
reverse_list(&list,2,5);
show_list(&list);
}
显示结果如上。