对单链表反转链表

有一单链表,节点定义如下,试将此单链表反转
struct Node {
	int data;
	Node* next;
};

  相信大家在平时的考试或者面试中经常会碰到此类反转单链表的题目,遇到这类问题如何应对呢?

初始状态

Created with Raphaël 2.2.0 Node1 Node2 Node3

反转后

Created with Raphaël 2.2.0 Node3 Node2 Node1

  下面且听我一点一点分解:

先写一个大家都会的遍历单链表的代码段

Node* p = head;
while(p) 
{
	//处理节点p	
	p = p->next;
}

试想一下,我们目标是反转,也就是说 p->next->next需要指向 p, 观察一下上面代码,每次得到p但是这个p需要下一个循环才能指向,也就是p->next->next,很自然想到:
需要一个临时变量备份p,取last=nullptr
循环内需要更新p->next, 执行last, 因此需要临时变量备份p->next, 因为这个值需要赋值给p,实现继续while循环
代码如下:

Node* reverse(Node* head)
{
    Node* last = nullptr;
    Node* p = head;
    while(p)
    {
        Node* t = p->next;
        p->next = last;
        last = p;
        p= t;	
    }
    return last;
}

总结

链表是一种常见的基础数据结构,是一种线性表,是实现栈和队列的基础,应用非常广泛,我们必须非常熟悉掌握链表的操作。单链表是链表中比较简单的形式,反转单链表操作,需要掌握链表的遍历和拆合节点操作,实现时候注意指针指向必要时需要增加临时变量存储,防止造成循环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值