206. Reverse Linked List
Reverse a singly linked list.
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
My code
struct ListNode* reverseList(struct ListNode* head){
if(!head)return head;
struct ListNode *q = head, *k = head->next, *p = (struct ListNode*)malloc(sizeof(struct ListNode));
if(!k)return head;
while (k->next) {
p->next = k->next;
k->next = q;
q = k;
k = p->next;
}
k->next = q;
head->next = NULL;
return k;
}
The others
//迭代
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* cur = NULL;
while (head) {
ListNode* next = head -> next;
head -> next = cur;
cur = head;
head = next;
}
return cur;
}
};
//递归
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if (!head || !(head -> next)) {
return head;
}
ListNode* node = reverseList(head -> next);
head -> next -> next = head;
head -> next = NULL;
return node;
}
};
思路
- 因为是链表,所以刚开始我想到了迭代和递归,然后不知觉中就使用了迭代,写的过程中,因为太久没有去接触C语言了,关于指针的东西有些模糊了,老是搞错东西,有没有“*”都不知道。打算要不要花一点时间去整理一下C语言的笔记呢?
关于这道题我想到是用三个指针,q是当前节点,k是下一个节点,因为这个节点要将next指向q,所以需要p来抓住k后面的链表。
然后迭代:p抓好k的下一个节点,然后k->next指向q,然后更新q和k的指向。迭代完之后,还要把k->next = q;因为迭代出来后这一步没有做,还有head->next =NULL,因为题目要求最后一个节点的指向为NULL。 - 第一次提交当然是Runtime Error!了,因为写的时候我想,既然是链表题,应该不会给我一个空的或者只有一个节点的链表吧(还是太年轻了)。然后我改了之后就accepted了!虽然代码看起来很冗余。
- 对比了一下别人的,我发现我有些变量是不需要的,这是习惯,还有想到了那样写会的话改变形参的位置,这样输出的时候使用的链表就不对了,现在再来想,当时是傻逼吗!不是还有返回值吗!!(捂脸)。
- 这是别人写的迭代思路(比我的简洁):在遍历列表时,将当前节点的下一个指针更改为指向其上一个元素。由于节点没有引用其上一个节点,因此必须事先存储其前一个元素。在更改引用之前,还需要另一个指针来存储下一个节点。不要忘记在最后返回新的头部参考!