思路:设置*p,*q,*t,*w,*u这些指针,将w=end->next,u=begin;
跑一个循环将t放在begin的前驱
for (t = h;t->next != begin;t = t->next);
在跑个循环`
for (q = begin, p = begin->next;begin->next != w;p = q->next)
{
q->next = p->next;
p->next = u;
u = p;
}
q->next=p->next前驱挂后继
p->next=u;将p指向的结点指向他的前驱
然后将u后移,p后移重复动作
出来将
t->next=u;
就是将t指向end
逆置完成
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int date;
struct node*next;
}ElemSN;
//创建链表
ElemSN*GreatLink(int Date[], int n)
{
int i;
ElemSN*p, *t = 0, *h = 0;
for (i = 0;i < n;i++)
{
p = (ElemSN*)malloc(sizeof(ElemSN));
p->date = Date[i];
p->next = NULL;
if (!h)
h = t = p;
else
t = t->next = p;
}
return h;
}
//输出链表
PrintLink(ElemSN*h)
{
ElemSN*p;
for (p = h;p;p = p->next)
printf("%3d", p->date);
printf("\n");
}
ElemSN* ReverLink(ElemSN*h, ElemSN*begin, ElemSN*end)
{
ElemSN*q, *p, *t, *w = end->next, *u = begin;
for (t = h;t->next != begin;t = t->next);
for (q = begin, p = begin->next;begin->next != w;p = q->next)
{
q->next = p->next;
p->next = u;
u = p;
}
begin->next = w;
t->next = u;
return h;
}
int main(void)
{
ElemSN *head, *k;
int a[8] = { 3,2,5,8,4,7,6,9 };
head = GreatLink(a, 8);
PrintLink(head);
head = ReverLink(head, head->next, head->next->next->next);
PrintLink(head);
system("pause");
}
运行环境 VS2017
输出结果:3,2,5,8,4,7,6,9
3,8,5,2,4,7,6,9
建议大家把链表完整的跑一边理解的会跟清楚