反转链表是数据结构课链表章节的必做入门题,今天心血来潮重新做了一下发现想不起来怎么做了,于是拿了张纸现推了一下,最后还是没费什么功夫就写了出来,然后再看历史提交发现这种写法跟自己以前写的略不一样。
写法一 三个指针(用时超过21.89%的C++用户)
代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head)
{
ListNode *pre=head;
ListNode *p=nullptr;
while(pre){
ListNode *tmp=pre->next;
pre->next=p;
p=pre;
pre=tmp;}
return p;
}
};
写法二 三个指针(用时超过65.65%的C++用户)
代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head)
{
if(!head) return NULL;
ListNode* p;
ListNode* q;
ListNode* r;
p = head;
q = head->next;
r = head;
while(p->next){
p->next = q->next;
q->next = r;
r = q;
q = p->next;
}
return r;
}
};
r永远指向当前链表的头,p永远指向原链表的头。
两种实现都不是很难,本质上都是模拟。比起法二那种倒反天罡的做法,法一明显更为直观。个人认为这道题不同实现用时之间的差异没什么意义。可以在纸上画幅图进行理解。