赞
踩
定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
思考题:
- 请同时实现迭代版本和递归版本。
数据范围
链表长度 [0,30]。
样例
输入:1->2->3->4->5->NULL
输出:5->4->3->2->1->NULL
迭代的方法:采用三个指针pre(前指针), cur (当前指针), next(后指针),(分三个步骤)
步骤一:(初始化) :
前指针 pre 等于 nullptr
当前指针 cur 等于 head(头结点)
next 指针指向 cur(也就是head)的下一指针
步骤二(反转链表):
当前指针 cur 指向 前指针 pre来实现反转。
前指针 pre 等于 当前指针 cur
当前指针cur 等于下一指针 next
下一指针 next 指向 cur(也就是head)的下一指针(也就是步骤一的最后一步)
步骤三(结束递归并返还pre链表)
如果当前指针 cur 指向 NULL结束递归
return pre;
-
- class Solution {
- public:
- ListNode* reverseList(ListNode* head) {
- //步骤一
- ListNode *p = nullptr;
- ListNode *cur = head;
- while(cur){
- //步骤二
- ListNode *next = cur -> next;//步骤一和步骤二都要有
- cur -> next = pre;
- pre = cur, cur = next;
- }
- //步骤三
- return p;
- }
- };
递归的方法:先将head递归到尾节点,再尾节点一步一步做相应的步骤)(分两个步骤)
步骤一(递归):
将 head 节点逐一递归
ListNode* tail = reverseList(head -> next);
步骤二(每次递归的步骤)
head -> next -> next = head; head -> next = nullptr;步骤一和步骤二的图解:
最后实现反转链表。
- /**
- * 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 || !head -> next) return head;
- ListNode *tail = ListNode(head -> next);//步骤一
- head -> next -> next = head;//步骤二
- head -> next = nullptr;
- }
- return tail;
- };
下一篇的预告: NULL和 nullptr的区别,还有递归和迭代的区别。
-----这些题目都是来自AC-wing。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。