反转单链表,我使用了两种方法,不过他们都很相近。
// 声明
class CList
{
public:
int Data;
CList *next;
public:
CList();
~CList();
};
// 声明反转单链表函数
void ReverseSLL(CList*&, CList* preNode = nullptr);
实现部分:
一.递归遍历到最后一个节点后,更改每个节点的next指针指向它上一个节点
void CSingleLinkedList::ReverseSLL(CList*& node, CList* preNode)
{
if (node == nullptr)
{
//这里为什么不能直接删去head?或者直接写成head->next = preNode;
//我想了好久,也没明白。如果有知道的请一定告诉我。
head = nullptr;
// delete head;
head = new CList;
head->next = preNode;
return;
}
ReverseSLL(node->next, node);
node->next = preNode;
}
二.递归每个节点,并同时修改其next指针指向
void CSingleLinkedList::ReverseSLL(CList*& node, CList* preNode)
{
if (node == nullptr)
{
head->next = preNode;
return;
}
CList* next = node->next;
node->next = preNode;
ReverseSLL(next, node);
}
调用函数
CSingleLinkedList sll;
sll.ReverseSLL(sll.head->next);
sll.DisPlay(sll.head);
以上函数是在我之前写过的一个单链表的基础上添加的。