一、迭代法
假设存在链表 1→2→3→∅,我们想要把它改成 ∅←1←2←3。
1.在遍历列表时,将当前节点的 \textit{next}next 指针改为指向前一个元素。由于节点没有引用其上一个节点,因此必须事先存储其前一个元素。在更改引用之前,还需要另一个指针来存储下一个节点。不要忘记在最后返回新的头引用!
struct ListNode* reverseList(struct ListNode* head){
struct ListNode *p, *pre = NULL;
while(head)
{
p = head->next;
head->next = pre;
pre = head;
head = p;
}
return pre;
}
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
执行第一次后:
2->3->4->5
1->NULL
执行第二次后:
3->4->5
2->1->NULL
执行第三次后:
4->5
3->2->1->NULL
执行第四次后:
5
4->3->2->1->NULL
执行第五次后:
5->4->3->2->1->NULL
二、递归法
struct ListNode* reverse(struct ListNode *pre, struct ListNode *p)
{
if(!p) return pre;
struct ListNode *r = p->next;
p->next = pre;
return reverse(p, r);
}
struct ListNode* reverseList(struct ListNode* head){
return reverse(NULL, head);
}