逆转链表:写一算法逆置带头结点的单链表L,要求逆置后的单链表利用L中的原结点,不可以重新申请结点空间。
链表结点的生命如下:
template <class Entry>
struct Node{
Entry data;
Node<Entry> *next;
};
请实现下面的函数:
Void reverse(Node<Entry> *L)
Void reverse(Node<Entry> *L) {
// 原地逆置单向链表
if (L == NULL) { // 头节点为空, 直接返回
return;
}
Node<Entry> *p = L->next; // 工作指针
if (p == NULL) { // 只有头节点, 直接返回
return;
}
Node<Entry> *q = p->next;
if (q == NULL) { // 只有一个元素, 直接返回
return;
}
p->next = NULL; // 第一项元素为逆置后的最后一个元素,其next的值为NULL
Node<Entry> *temp;
while (q) {
temp = q->next; // 临时保存q的下一个节点
q->next = p; // 翻转指针,由后一个元素指向前一个元素
p = q; // 向后移动一个元素
q = temp; // 向后移动一个元素
}
L->next = p; // 将头节点指向最后的节点
}