题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
思路:
反转链表本身不难,但是要注意反转的过程中不能出现断裂的情况,比如上图中将节点i反转之后,节点j可能会找不到,那么我们需要事先将j存储下来,这样就不会出现丢失节点的情况。还有就是需要应对链表头节点为空,或者链表只有一个节点的特殊情况,写出对应的处理方法,提高代码的鲁棒性。
代码:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
ListNode* ReverseList(ListNode* pHead)
{
ListNode* pReversedHead = nullptr;
ListNode*pNode = pHead;
ListNode*pPre = nullptr;
while (pNode!=nullptr)
{
ListNode*pNext = pNode->m_pNext;
if (pNext == nullptr)
{
pReversedHead = pNode;
}
pNode->m_pNext = pPre;
pPre = pNode;
pNode = pNext;
}
return pReversedHead;
}
复习:
反转链表的时候要记录前后节点的指针,还有while函数可以用来判断头指针为空指针的情况,所以不要单独再进行判断了。
二刷代码:
struct ListNode
{
int m_value;
ListNode* m_pNext;
};
ListNode* ReverseList(ListNode* pHead)
{
ListNode* pNode = pHead;
ListNode* pPre = nullptr;
ListNode* pReverseNode = nullptr;
while (pNode!=nullptr)
{
ListNode* pNext = pNode->m_pNext;
if (pNext == nullptr)
pReverseNode = pNode;
pNode->m_pNext = pPre;
pPre = pNode;
pNode = pNext;
}
return pReverseNode;
}