单链表逆置——C++实现的两种方法

方法一:

实现单链表逆置的时候,把下一节点提前保存,然后修改指向关系,再更新遍历的节点,最后更改头指针的指向和引用即可

//方法一
#include <stdio.h>

//单链表的结构体
typedef struct node
{
	int data;
	struct node* next;
}Node,*pNode;


void reverseLinkList(pNode &pListHead)				//注意使用的是引用
{
	if (pListHead == NULL || pListHead->next == NULL)    //若链表为空或者只有一个节点的情况 返回不处理
		return;
	pNode pPre = pListHead;
	pNode pCur = pListHead->next;
	pNode pNext = NULL;

	while (pCur != NULL)
	{
		//前三句的思路和交换两个数据的思路是一样的  先用一个容器保留下来
		pNext = pCur->next;	    //保存下一节点
		pCur->next = pPre;		//更改指向关系
		pPre = pCur;			//更新节点
		pCur = pNext;
	}
	pListHead->next = NULL;		//使尾节点的下一指向为NULL
	pListHead = pPre;			//更新头节点
}
void printfList(pNode pListHead)
{
	//if (pListHead == NULL)
		//return;
	pNode pCur = pListHead;
	while (pCur != NULL)
	{
		printf("%d->", pCur->data);
		pCur = pCur->next;
	}
}
int main(int argc,char* argv[])
{
	Node p5{ 5, NULL };
	Node p4{ 4, &p5 };
	Node p3{ 3, &p4 };
	Node p2{ 2, &p3 };
	Node Head{ 1, &p2 };
	pNode pHead = &Head;
	printfList(pHead);
	reverseLinkList(pHead);
	printf("逆转后\n");
	printfList(pHead);
}

思路草图如下,供参考:

单链表逆置——C++实现的两种方法

单链表逆置——C++实现的两种方法


方法二:采用递归的方式实现——这种方法简单一些

基本思想:在对当前结点逆置时,先递归地逆置其后继结点,然后将后继结点指向当前结点。

实现代码如下:

#include <stdio.h>

//单链表的结构体
typedef struct node
{
	int data;
	struct node* next;
}Node,*pNode;


//方法二

void reverseLinkList(pNode pCur, pNode& ListHead)
{
	if ((NULL == pCur) || (NULL == pCur->next))
	{
		ListHead = pCur;
	}
	else
	{
		pNode pNext = pCur->next;
		reverseLinkList(pNext, ListHead);					//递归逆置后继结点
		pNext->next = pCur;									//将后继结点指向当前结点。  
		pCur->next = NULL;
	}
}
void printfList(pNode pListHead)
{
	//if (pListHead == NULL)
		//return;
	pNode pCur = pListHead;
	while (pCur != NULL)
	{
		printf("%d->", pCur->data);
		pCur = pCur->next;
	}
}
int main(int argc,char* argv[])
{
	Node p5{ 5, NULL };
	Node p4{ 4, &p5 };
	Node p3{ 3, &p4 };
	Node p2{ 2, &p3 };
	Node Head{ 1, &p2 };
	pNode pHead = &Head;
	printfList(pHead);
	reverseLinkList(pHead,pHead);
	printf("逆转后\n");
	printfList(pHead);
}