反转一个单链表。力扣
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL
解法一:迭代法。通过三个值保存信息。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverseList(ListNode* head) { //迭代法 ListNode* pRevHead = nullptr; //反转后的头部 ListNode* pCurrent = head; //头节点作为当前节点 ListNode* pBefore = nullptr; //前一个节点 while (pCurrent != nullptr) //节点为空时跳出 { ListNode* pNext = pCurrent->next; //保存下一节点 if (pNext == nullptr) pRevHead = pCurrent; //如果到了尾节点, 当前节点作为头节点 pCurrent->next = pBefore; //当前节点指向前一个节点 pBefore = pCurrent; //更新两个值 pCurrent = pNext; } return pRevHead; } };
解法二:递归法
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverseList(ListNode* head) { //递归版 if (head == nullptr || head->next == nullptr) return head; //先反转后面的节点, 寻找末尾节点 ListNode* pReverseNode = reverseList(head->next); //将当前节点设置为下一节点的后续节点 head->next->next = head; head->next = nullptr; return pReverseNode; } };
类似题目:《剑指offer》第二十四题:反转链表