有一单链表,节点定义如下,试将此单链表反转
struct Node {
int data;
Node* next;
};
相信大家在平时的考试或者面试中经常会碰到此类反转单链表的题目,遇到这类问题如何应对呢?
初始状态
反转后
下面且听我一点一点分解:
先写一个大家都会的遍历单链表的代码段
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;
}
总结
链表是一种常见的基础数据结构,是一种线性表,是实现栈和队列的基础,应用非常广泛,我们必须非常熟悉掌握链表的操作。单链表是链表中比较简单的形式,反转单链表操作,需要掌握链表的遍历和拆合节点操作,实现时候注意指针指向必要时需要增加临时变量存储,防止造成循环。