链表逆序(c++)

主要实现思路:

    思路1,

        第一步,确定链表结点个数作为for循环结束条件;

        第二步,for循环到链表尾,将尾结点头插到当前链表,删除尾结点,到此结束第一次循环;

    思路2,

        第一步,创建一个新链表保存逆序结果;

        第二步,while循环从链表第一个结点开始向新链表进行头插,注意是“头插”;


代码实现:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>

using namespace std;

struct LinkNode{
int num;
LinkNode * next;
};


class LinkList{
public:
//初始化
void init_linkList()
{
this->head = new LinkNode();
}
//头插,头结点不保存数据
void insert_linkList(int num)
{
LinkNode * newNode = new LinkNode();
newNode->num = num;
newNode->next = head->next;
head->next = newNode;
}
//遍历
void print_linkList()
{
LinkNode * tmp = head->next;
while (tmp != NULL)
{
cout << tmp->num << " ";
tmp = tmp->next;
}
cout << endl;
}
//逆序
void reverse_linkList()
{
/*
一般思路:从第一个元素开始头插到另一个链表中去
*/
LinkNode * newNode = new LinkNode();
LinkNode * p = newNode->next;
LinkNode * tmp = this->head->next;
while (tmp != NULL)
{
LinkNode * tmp_next = tmp->next;
//将当前结点挂到新链表
tmp->next = p;
newNode->next = tmp;
//更新新链表插入位置
p = tmp;
//当前结点指针后移
tmp = tmp_next;
}
this->head = newNode;
}
private:
LinkNode * head;
};
//测试代码
void test01()
{
LinkList list;
list.init_linkList();
for (int i = 0; i < 10; ++i)
{
list.insert_linkList(i);
}
cout << "****************逆序前*******************" << endl;
list.print_linkList();

list.reverse_linkList();
cout << "****************逆序后*******************" << endl;
list.print_linkList();
}
int main()
{
test01();
system("pause");
return EXIT_SUCCESS;
}

猜你喜欢

转载自blog.csdn.net/goal_ff/article/details/79947661