给定一个单链表,编程实现其逆转。单链表的逆转过程的关键是3个指针:一个记录当前逆转节点的前一个节点,一个记录当前逆转节点的下一个节点,另外一个则记录当前的逆转节点。为什么要3个指针呢?其原因就在于当修改了当前逆转节点的next域后(逆转),链表就暂时断了(即无法再定位下一个节点),因此需要一个指针记录其下一个节点位置(要能够依次遍历)。记录前一个节点位置则很明显:因为要将当前逆转节点的next域指向其上一个节点(这样才叫逆转)。
//逆转单链表
struct node *reverse_LList(node *head)
{
//以p作为当前结点处理,头结点为逆转前的头结点
struct node *p,*q,*temp;
if(head == NULL)
cout << "空表" << endl;//头结点为0,空表
q = head; //q指向头结点
p = head->next; //p指向头结点后一个结点
head = p; //头结点进一位
temp = p->next; //保存当前结点指针域
q->next = NULL; //逆转头结点为尾结点的情况,头指针为空
p->next = q; //后一个结点指向头结点
while(temp->next != NULL) //判断当前结点的后一结点指针域是否为空,即判断是否为尾结点
{
q = head; //q指向头结点
p = temp; //p指向头结点后一个结点
temp = p->next; //保存当前结点指针域
head = p; //头结点进一位
p->next = q; //后一个结点指向头结点
}
//此时temp表示以前的尾结点,p表示temp结点的前一结点
head = temp; //逆转尾结点为头结点
head->next = p; //头结点指针域指向p
return head;
}
Node* LinkListReserve(LinkNode head)
{
LinkNode p = NULL; //记录逆转节点的前一个节点;
LinkNode r = head; //记录当前节点;
LinkNode q = NULL; //记录逆转节点的下一个节点;
while (r != NULL)
{
q = r->_next; //保存下一个节点
r->_next = p; //逆转
p = r; //下一次遍历
r = q;
}
return p;
}
本文详细介绍了如何使用三个关键指针逆转单链表,包括处理头结点为空、链表断开以及循环遍历链表的过程。通过具体代码实现,确保读者能够理解和掌握单链表逆转的核心算法。
2535

被折叠的 条评论
为什么被折叠?



