这篇文章前提主要是用于一些简单的单链表逆转,节点中的元素比较简单的情况下。
列如
typedef struct jd//结构体
{
int data;
struct jd* next;
}node;
等这些比较简单的节点。
首先我们先建立一个建立一个单链表
一、首先初始化单链表,生成一个表头。
返回值为一个节点指针。
node* creathead ()//单链表的初始化
{
node* Q = new node;
Q->next = NULL;
return Q;
}
二、建立一个链表,使用尾插法
void creatList (node* &Q)
{
node* a1=Q;
for ( int i = 1;i <= 10;i++ )
{
node* p = new node;
p->data = i;
p->next = NULL;
a1->next = p;
a1= p;
}
}
形参为一个指向表头节点的指针。
创造了数据元素为1,2,3,4,5,6,7,8,9,10的一个单链表.
三、计算单链表的长度
我们可以用一个全局变量来计算单链表的长度(长度是单链表中除了表头中节点的个数)
#include<iostream>
using namespace std;
int LENGTH = 0;
void creatList (node* &Q)
{
node* a1=Q;
for ( int i = 1;i <= 10;i++ )
{
node* p = new node;
LENGTH++;//每创造一个节点就让LENGTH加1。
p->data = i;
p->next = NULL;
a1->next = p;
a1= p;
}
}
这样每创造一个节点就让LENGTH加1。
或者用一个自己写的函数来统计单链表长度
int length (node* Q)
{
int i = 0;
node* p = Q->next;
while ( p != NULL )
{
i++;
p = p->next;
}
return i;
}
四、逆转单链表
我的想法是先用一个数组来存储节点中的数据,在让数组来储存,然后再让数组倒过来重新给单链表赋值
void reversion (node* Q)
{
int i = length (Q),* ss = new int[i],j=0;
node* p = Q->next,*p1=p;
while ( p != NULL )
{
ss[j] = p->data;
j++;
p = p->next;
}
//至此先将单链表中的数据存储在了数组ss中
// 因为数组的大小正好等于单链表的长度,所以不必担心数组大小问题
j--;
for( int k = j;k >= 0;k-- )
{
p1->data = ss[k];
p1 = p1->next;
}
}
五、总结
其实这并不算是单链表的逆转,但是这是一种极其好理解的逆转简单单链表中数据的一种方法
这种先用数组存储的思维还可以用来一下其他的问题中
比如:简单节点链表的排序问题等,先让数组比较大小排序后,在重新赋值给链表。
我也是一个初学者,这些都是一些自己简单的理解,如有不足,还望见谅,希望各位能够指出。