算法练习1:反转链表

什么是链表

n个结点链接成一个链表。
结点是链表的基本单元,单个结点包含指针域和数据域。
把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称为指针或链。这两部分信息组成数据元素称为存储映像,称为结点(Node)。
假设p是指向线性表第i个元素的指针,则该节点ai的数据域我们可以用p->data来表示,p->data的值是一个数据元素,节点ai的指针域可以用p->next来表示,p->next的值是一个指针。

反转链表的思路

首先定义两个指针:pre和cur,cur指向当前结点,pre指向当前结点的前一个结点。
然后遍历链表的同时,当前 node (curr)的下一个(next)指向前一个 node(prev), 在改变当前 node 的指向之前,用一个临时变量记录当前 node 的下一个 node(curr.next)。这样就完成了第一个结点和第二个结点的反转。然后再将pre和cur往后挪,pre指向当前结点,cur指向当前结点的后一个结点(刚刚存储的临时变量temp),这样一次循环就完成了。经过多次循环,链表的反转就完成了。

代码实现

class Solution {
  public:
    ListNode* ReverseList(ListNode* pHead) {
        if (pHead == NULL)
            return NULL;
        ListNode* cur = pHead;
        ListNode* pre = NULL;
        while (cur != NULL) {
            //断开链表,要记录后续一个 fast-template
            ListNode* temp = cur->next;
            //当前的next指向前一个
            cur->next = pre;
            //前一个更新为当前
            pre = cur;
            //当前更新为刚刚记录的后一个
            cur = temp;
        }
        return pre;}
};

参考链接:https://www.zhihu.com/question/57414576
https://blog.51cto.com/u_13691366/3268583
牛客网

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值