将Head指向的非空单向链表,把从begin开始的到end结束的子链逆置(C语言实现)

思路:设置*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
建议大家把链表完整的跑一边理解的会跟清楚

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值