leetcode-反向链表

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了!虽然代码看起来很冗余。
  • 对比了一下别人的,我发现我有些变量是不需要的,这是习惯,还有想到了那样写会的话改变形参的位置,这样输出的时候使用的链表就不对了,现在再来想,当时是傻逼吗!不是还有返回值吗!!(捂脸)。
  • 这是别人写的迭代思路(比我的简洁):在遍历列表时,将当前节点的下一个指针更改为指向其上一个元素。由于节点没有引用其上一个节点,因此必须事先存储其前一个元素。在更改引用之前,还需要另一个指针来存储下一个节点。不要忘记在最后返回新的头部参考!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值