单链表的逆序打印和逆置翻转操作

单链表的逆序打印:

第一种方法(非递归实现):

逆序打印单链表,不能修改原单链表,所以在这里需要两个变量进行标记。对于cur,作为起始位置的标记,而end作为末尾的标记。当cur走到最后一个节点的时候,打印最后一个结点的data值,并让end记录当前cur。所以,总共有两层循环,整体大的循环结束的标志是end等于cur,而另一层循环,则是让cur每次循环,走到end标记的位置即停止。示意图如下:

代码如下:

void InverseOrder(List *pList)
{
	List *end = NULL;
	while(pList != end)
	{
		List *cur = pList;
		while(cur->next != end)
		{
			cur = cur->next;
		}
		printf("%d ", cur->data);
		end = cur;

	}
}

第二种方法(递归实现):

使用递归实现打印有两种方法。两者的区别结束标志不同,第一种是让pList执行到NULL位置处,而第二种则判断的是pList的next。

第一种:

void InverseOrder(List *pList)
{
	if(pList == NULL)
	{
		return;
	}
	InverseOrder(pList->next);
	printf("%d ", pList->data);
}

第二种:

void InverseOrder(List *pList)
{
	if(pList->next == NULL)
	{
		printf("%d ", pList->data);
	}else
	{
		InverseOrder(pList->next);
		printf("%d ", pList->data);
	}
}

单链表的逆置翻转:

第一种方法:

使用两个指针,通过遍历单链表,两个指针同时向后走,并修改另一个指针的next值,保存在result中。示意图如下:

代码如下:

List *Reverse(List *pList)
{
	List *cur = pList;
	List *node;
	List *result = NULL;
	while(cur != NULL)
	{
		node = cur;
		cur = cur->next;
		node->next = result;
		result = node;
	}
	return result;
}

第二种方法:

使用三个指针,分别指向NULL,pList,pList->next。遍历整个链表,修改p2的next。

代码如下:

List *Reverse(List *pList)
{
	List *p1 = NULL;
	List *p2 = pList;
	List *p3 = pList->next;
	while(p2 != NULL)
	{
		p2->next = p1;
		p1 = p2;
		p2 = p3;
		if(p3 != NULL)
		{
			p3 = p3->next;
		}
	}
	return p1;
}

第三种方法:

使用cur标记pList,在遍历链表的时候,对另一个空链表进行头插。代码如下:

void PushFront(List **pList, int data)
{
	List *newNode = CreateNode(data);
	if(*pList == NULL)
	{
		*pList = newNode;
		return;
	}
	newNode->next = *pList;
	*pList = newNode;
}
List *Reverse(List *pList)
{
	List *result = NULL;
	List *cur  = pList;
	while(cur != NULL)
	{
		PushFront(&result,cur->data);
		cur = cur->next;
	}
	return result;
}

猜你喜欢

转载自blog.csdn.net/qq_37415461/article/details/82812620
今日推荐