206 反转链表
题目链接:https://leetcode-cn.com/problems/reverse-linked-list/
思路一:双指针解决
定义1个prev的前驱指针,cur来工作指针,next来保存cur的下一个,如果不保存cur的下一个,cur指向prev后则找不到cur的next了。当cur走到空时循环结束。注意返回头结点,结束时头结点是prev
。
如下图:
代码如下:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
//定义1个前驱指针
ListNode* prev = nullptr;
ListNode* cur = head;
while(cur)
{
ListNode* next = cur->next;
//修改链接关系
cur->next = prev;
//继续迭代往下走
prev = cur;
cur = next;
}
//最后的头是prev
return prev;
}
};
ok,就过了。时间复杂度即是链表的长度为O(N)。
思路二:头插法
设定义1个newhead为头指针,next保存cur的下一个,依次拿下头插,在更新头接节点即可。
代码如下:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* newhead