原题目链接:https://leetcode-cn.com/problems/reverse-linked-list/
解题思路
示例:“1”->“2”->“3”->“4”
我们先用p1,p2,p3,p4分别代表指向1,2,3,4的指针,然后来分析反转的过程是怎样进行的。
- 尾指针清空,p1->next == NULL
- 依次将后一个元素放在最前面一个元素的前面,
p2->next = p1;
p3->next = p2;
p4->next = p3; - 返回头指针,return p4
我们可以看到左边是p2,p3,p4,右边是p1,p2p,p3,可以猜到只需要两个变量p和pp,其中pp在原链表中是p->next。
所以迭代式是:
pp->next = p;
p = pp;
pp = pp->next;
可以看到pp = pp->next;在复制时,原值已经更新了,因此需要一个临时变量temp保存做过值,因此最终的迭代式为:
temp = pp->next;
pp->next = p;
p = pp;
pp = temp;
最后判断一下:
初始条件:
struct ListNode *temp = head, *p0 = head, *p1 = head->next;
head->next = NULL;
终止条件:
p1 == NULL
,也就是说没有下一个元素需要放在最前面一个元素的前面
特殊值:
if(head == NULL || head->next == NULL){
return head;
}
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* reverseList(struct ListNode* head){
if(head == NULL || head->next == NULL){
return head;
}
struct ListNode *temp = head, *p0 = head, *p1 = head->next;
head->next = NULL;
while(p1 != NULL){
temp = p1->next;
p1->next = p0;
p0 = p1;
p1 = temp;
}
return p0;
}
欢迎帮我去原帖点个赞:
https://leetcode-cn.com/problems/reverse-linked-list/solution/zhi-zhen-hen-duo-zhong-dian-shi-zen-yao-9oogl/
突然发现CSDN可以打赏了,余额有闲钱的道友欢迎给我打赏哈,本人缺钱。。。