题目
Reverse a singly linked list.
Example:
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
分析
- 定义虚拟头节点以及p,q两个指针变量,完成每一步的翻转操作
- 这里的虚拟头节点ret并没有指向head,而是充当了中间过度变量的作用
代码和注释
方法一:循环做法(非递归)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
struct ListNode ret, *p, *q; //定义虚拟头节点和指针变量
ret.next = NULL; //虚拟头在这道题目里充当中间过度变量的作用,在p指针往后移动之前把p赋值给net.next;
p = head;
while (p) {
q = p->next;
p->next = ret.next;
ret.next = p;
p = q;
}
return ret.next; //运行到这里p为空,如果应该返回p之前的ret.next
}
方法二:递归做法
struct ListNode* reverseList(struct ListNode* head){
if (!head || !head->next) {
return head;
}
//printf("%d,", head->val);
struct ListNode* node = reverseList(head->next);
head->next->next = head;//这一步实现了相邻两个元素的反向连接
printf("%d,", node->val);
head->next = NULL; //这里把原来的正向连接断开,第一个元素指向null.如果不断开,第一个元素不指向null,会导致超时
return node;
}