这是本专栏的第一篇博客,还是要说几句哈。读到博客的小伙伴,我已经默认你有一定的计算机基础(抑或找工作的经验了),所以就不再解释每道题目的含义了,除非特别绕口的,本博客主要是提供一种思路和一个勉强能运行的代码示例,可能不是最优解,所以还想通过博客的方式跟大家一起探讨一二。
题目描述:单链表的逆序,就是反转链表
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
思路:本文提供一种原地反转的方法,想象就地箭头转过来的样子,三个指针
- 第一个指针是一个指向NULL的指针pre,这个指针就是后面反转后的头节点
- 第二个指针指向当前头节点的指针cur,这个指针后续会一直向前移动
- 第三个指针是一个临时指针,用来保存cur的next指针(保证链表不会断掉),这个指针后续也会一直向前移动
- 一定要注意判断头节点是否为空,不然就是思路不周详
#include<iostream>
#include<vector>
#include<string>
using namespace std;
struct ListNode//单链表的定义
{
int data;
ListNode* next;
ListNode(int x):data(x), next(NULL){}//初始化
};
//输出链表
void show(ListNode* head)
{
if(head == NULL)
{
cout << "nullptr" << endl;
}
ListNode* p = head;
while(p)
{
cout << p->data << endl;
p = p ->next;
}
}
class Solution
{
public:
ListNode* reverseList(ListNode* head)
{
if(head == NULL) return head;//一定要注意判断头节点是否为空,不然就是思路不周详
ListNode* pre = NULL;
ListNode* cur = head;
while(cur)
{
ListNode* temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
return pre;//返回值一定是链表的头节点,这样才可以后续引用这个链表
}
};
int main()
{
Solution s;
ListNode* head = new ListNode(1);
ListNode* node, *p;
p =head;
for(int i = 2; i <= 8; ++i)
{
node = new ListNode(i);
p->next = node;
p = node;
}
show(head);
ListNode* h = s.reverseList(head);
show(h);
return 0;
}
如果不能理解,可以插播一张图片解释(图片出自男朋友之手)
上述是一种迭代的算法,同样可以采用递归的算法
ListNode* reverseList(ListNode* head) {
if (head == NULL || head->next == NULL) return head;
ListNode* p = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return p;
}