链表的逆置

方法1:

依次将指针反向,最后令头指针指向尾元素。

逆置过程如下:

链表的逆置_第1张图片

链表的逆置_第2张图片 

链表的逆置_第3张图片 

当q指针为空时,循环结束。 

链表的逆置_第4张图片 

//试写一算法,对单链表实现就地逆置,
void Reverse1(List plist)//太复杂,不用掌握
{
	assert(plist != NULL);
	if (plist == NULL||plist->next==NULL||plist->next->next==NULL)
		return;

	Node* p = plist->next;//前面的点;
	Node* q = p->next;//后面的点;
	Node* r;//后面所有还未处理的第一个点;

	p->next = NULL;
	while (q != NULL)
	{
		r = q->next;
		q->next = p;//向后转
		p = q;
		q = r;
	}
	plist->next = p;
}

方法2:

依次取链表中的元素,进行头插,实现链表的逆置。

链表的逆置_第5张图片

链表的逆置_第6张图片 

链表的逆置_第7张图片 

链表的逆置_第8张图片 

p为空时,循环结束 

链表的逆置_第9张图片 

void Reverse(List plist)//一定要掌握
{
	assert(plist != NULL);
	if (plist == NULL || plist->next == NULL || plist->next->next == NULL)
		return;

	Node* p = plist->next;
	Node* q = p->next;

	plist->next = NULL;//断开

	//利用头插把节点插入到链表中
	while (p != NULL)
	{
		q = p->next;

		p->next = plist->next;//头插
		plist->next = p;

		p = q;
	}
}

你可能感兴趣的:(数据结构与算法,链表,数据结构)