2.1 反转整个链表(#206)
题目描述:
反转一个单链表。
示例:
输入:
1
−
>
2
−
>
3
−
>
4
−
>
5
−
>
N
U
L
L
1->2->3->4->5->NULL
1−>2−>3−>4−>5−>NULL
输出:
5
−
>
4
−
>
3
−
>
2
−
>
1
−
>
N
U
L
L
5->4->3->2->1->NULL
5−>4−>3−>2−>1−>NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
2.1.1 迭代循环实现
代码-C
/**
* Definition for singly-linked list.
* struct ListNode {
* int data;
* struct ListNode *next;
* };
*/
/* 迭代循环实现-1 */
struct ListNode* reverseList(struct ListNode* head){
struct ListNode *pre = NULL; //前驱结点
struct ListNode *cur = head; //后继结点
struct ListNode *next = NULL; //保存下一个结点
while(cur != NULL)
{
next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
// cur == NULL结束循环,pre就指向最后一个结点
return pre;
}
2.1.2 递归实现
- 递归总览:
- 递归调用过程
代码-C
/* 递归实现 */
struct ListNode* reverseList(struct ListNode* head){
if(head == NULL || head->next == NULL)
return head;
struct ListNode *cur = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return cur;
}