单链表的反转

一、首先我定义了这样一个单向链表:

struct ListNode
{
	int m_nKey;//数据域
	ListNode* m_pNext;//指针域
};

并且创建了一个名为list的链表,共有10个节点,节点数据域为1~10

//创建一个节点值为1~n的链表
ListNode* CreateList(int begin,int end) {
	//创建一个链表
	ListNode* pHead, *pRear;
	pHead = pRear = nullptr;
	for (int i = begin;i <= end;i++) {
		ListNode* pNewNode = new ListNode;
		pNewNode->m_nKey = i;
		pNewNode->m_pNext = nullptr;
		if (pHead == nullptr) {
			pHead = pRear = pNewNode;
		}
		else {
			pRear->m_pNext = pNewNode;
			pRear = pNewNode;
		}
	}
	return pHead;
}

int main()
{
    
	//创建一个节点值为1-10的链表
	ListNode* list = CreateList(1,10);
}

二、链表的反转:

(1)第一种方式:

设置三个指针:pList,qList,rList

使用pList和qList两个指针配合工作,使得两个节点间的指向反向,同时用rList记录剩下的链表,防止反向时后面的节点丢失。

//4.将单链表反转
ListNode* ReverseList(ListNode* list) {
	ListNode* pList = list;
	ListNode* qList = list->m_pNext;
	ListNode* rList = list->m_pNext->m_pNext;
	list->m_pNext = nullptr;//注意这里要将原来头节点下一个指向置空
	while (qList != nullptr) {
		qList->m_pNext = pList;
		pList = qList;
		qList = rList;
		if(rList) //防止报错异常,最后当qList为nullptr时,rList也为空就没有m_pNext了
		rList = rList->m_pNext;
	}
	return pList;
}

(2)第二种方式:本质上跟第一种是一样,只不过我们改变了传进来的的链表list,所以只需要另外用两个指针pre和qList

配合list就可以完成反转(写起来更简便)

//4.将单链表反转
ListNode* ReverseList(ListNode* list) {
	ListNode* pre = nullptr;
	ListNode* qList = nullptr;
	while (list != nullptr) {
		qList = list->m_pNext;
		list->m_pNext = pre; //第一次赋值时,让list的下个节点指向空
		pre = list;
		list = qList;
	}
	return pre;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值