一、首先我定义了这样一个单向链表:
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;
}