反转链表
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
迭代思路
用两个指针分别指向链表的当前节点pCurNode,和当前节点的前驱节点pPrevNode,初始pCurNode = head, pPrevNode = nullptr, 遍历整个链表,每次都将pCurNode的next指向pPrevNode,然后pCurNode和pPrevNode后移,当pCurNode为空时,说明链表已经反转完成,此时pPrevNode指向反转链表的头节点,返回即可
ListNode* reverseList(ListNode* head) {
ListNode* pCurNode = head;
ListNode* pPrevNode = nullptr;
while(pCurNode){
ListNode* pNextNode = pCurNode->next; //记录当前节点的下一个节点
pCurNode->next = pPrevNode; //反转当前节点的next
pPrevNode = pCurNode; //后移
pCurNode = pNextNode;
}
return pPrevNode;
}
递归思路
1.返回值:反转链表的头节点
2.参数:当前节点和当前节点的前驱节点
3.每层递归的逻辑:将当前节点的next指向当前节点的前驱节点,然后将当前节点和它的前驱节点后移
4.递归结束条件:当前节点为nullptr时退出结束递归
ListNode* reverseLists(ListNode* pCurNode, ListNode* pPrevNode)
{
if(pCurNode==nullptr)
return pPrevNode;
ListNode* pNextNode = pCurNode->next;
pCurNode->next = pPrevNode;
pPrevNode = pCurNode;
pCurNode = pNextNode;
return reverseLists(pCurNode,pPrevNode);
}
ListNode* reverseList(ListNode* head) {
ListNode* pCurNode = head;
ListNode* pPrevNode = nullptr;
return reverseLists(pCurNode,pPrevNode);
}