过程分析:
代码实现:
#include <iostream>struct LinkNode{ //创建一个结构体做为链表的结点int data; //数据域LinkNode* next; //指针域
};void Print_Link(LinkNode* phead) //打印链表
{while (phead != nullptr){std::cout << phead->data << " ";phead = phead->next;}std::cout << std::endl;
}LinkNode* inverse(LinkNode* phead) //链表反转函数
{if (phead == nullptr || phead->next == nullptr) //判断头指针是否指向链表头结点,或者链表是否存在return phead;LinkNode* pre_current = nullptr;LinkNode* current = phead;LinkNode* next_current = phead->next;while (1) //遍历链表{current->next = pre_current; //修改mid指向的结点的指针域,令其指向beg所指的结点if (next_current == nullptr) //判断end是否为空,如果为空表示链表已经遍历完毕break;pre_current = current; //整体偏移三个指针current = next_current;next_current = next_current->next;}phead = current; //遍历结束后,链表完成反转,修改头指针指向新的链表头结点return phead;
}int main()
{LinkNode t6 = { 6,nullptr };LinkNode t5 = { 5,&t6 }; //只为做验证,用了静态创建链表的方式,实际中一般不会用这种方式LinkNode t4 = { 4,&t5 };LinkNode t3 = { 3,&t4 };LinkNode t2 = { 2,&t3 };LinkNode t1 = { 1,&t2 };LinkNode* head = &t1; //创建头指针,用此方法反转链表可以不需要用到头指针,后面的函数的形参可以直接使用&t1,结果是一样的std::cout << "链表反转前元素为:\n";Print_Link(head);std::cout << "链表反转后元素为:\n";head = inverse(head);Print_Link(head);return 0;
}
运行结果: