标签:后退 tps tno 节点 int ima height link 定义
1、反转链表递归和迭代版本
原题:leetcode 206. Reverse Linked List
Reverse a singly linked list.
迭代版本:
思路:通过举例分析可以知道,在反转其中一个链表后,会发生断裂情况,没法知道下一个链节点,需要建立三个节点,所以需要首先保存后一个节点,然后将后一个结点的next指向前一个节点,接下来依次后退,pPre=pCur;pCur=pNext。

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
//迭代版本iterator
ListNode* reverseList1(ListNode* head) {
if (head == nullptr)
return head;
ListNode* pNext(0), *pCur = head, *pPre(0), *pRevHead(0);
while (pCur != nullptr) {
pNext = pCur->next;//首先保存下一结点值
if (pNext == nullptr)
pRevHead = pCur;
pCur->next = pPre;//调整指针
pPre = pCur;//结点后移
pCur = pNext;
}
return pRevHead;
}
};
递归版本:思路和迭代差不多,只不过在最后两个节点交换的时候,使用递归版本实现。递归要考虑到原函数初始定义会在后面递归的时候不断的重新定义,这里思考出现卡顿,所以引入一个辅助函数。
ListNode* helper(ListNode* pPre, ListNode* pCur) {
ListNode* pNext(0), * pRevHead(0);
if (pCur == nullptr)
return pPre;
pNext = pCur->next;//首先保存下一结点值
if (pNext == nullptr)
pRevHead = pCur;
pCur->next = pPre;//调整指针
return helper(pCur, pNext);
}
ListNode* reverseListRecur(ListNode* head) {
ListNode *pCur = head, *pPre(0), *pRevHead(0);
if (head == nullptr) {
return head;
}
pRevHead= helper(pPre, pCur);
return pRevHead;
}
标签:后退 tps tno 节点 int ima height link 定义
原文地址:http://www.cnblogs.com/dingxiaoqiang/p/6944086.html