1. 程式人生 > >連結串列逆序(c++)

連結串列逆序(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;
}