剑指 Offer 24. 反转链表 - 力扣(LeetCode) (leetcode-cn.com)
目录
方案1
链表节点依次进栈,出栈时调整指针。
非递归
运行结果
代码
class Solution {
#define scale 0x1388
typedef ListNode* Lnode;
Lnode* stk;
int sp;
public:
ListNode* reverseList(ListNode* head) {
if(!head) return NULL;
stk = new Lnode[scale]; sp = 0;
for (Lnode iter = head; iter != NULL; iter = iter->next) stk[sp++] = iter;
Lnode rhead = stk[--sp];
for (Lnode riter = rhead; sp; riter = riter->next) riter->next = stk[--sp];
stk[0]->next = NULL;
return rhead;
}
};
递归
运行结果
代码
class Solution {
ListNode* rhead;
public:
ListNode* reverseList(ListNode* head) {
if (!head) return NULL;
_reverse(head)->next = NULL;
return rhead;
}
ListNode* _reverse(ListNode* node) {
return node->next ?
_reverse(node->next)->next = node : rhead = node;
}
};
方案2
遍历一遍。iter指向当前节点,使用pre记录iter的前一个节点,nxt记录iter的下一个节点。每次操作,首先让nxt指向iter的下一个节点,然后iter->next指向pre,pre再指向iter,最后iter更新为nxt,如此循环往复。
运行结果
代码
class Solution {
public:
ListNode* reverseList(ListNode* head) {
typedef ListNode* Lnode;
Lnode pre = NULL, iter = head, nxt;
while (iter) {
nxt = iter->next;
iter->next = pre;
pre = iter;
iter = nxt;
}
return pre;
}
};