数据结构--单链表反转(图文教程)

今天突然听朋友提到单链表,就想写一个图文教程,有不对的地方希望大家指出,共同进步!

 

链表反转代码

void reserveLinkList(Node *L)
{
    Node *p,*q,*t;  //*p--前驱指针,*q--当前指针,*t--缓存的下一个结点
    p = L;
    q = L->next;


    if(L==NULL || L->next == NULL || L->next->next ==NULL)
        return ;
    while(q!= NULL)
    {
        t = q->next; //缓存后面的链表

        q->next = p;//逆置
        p = q;  //让p下移一个结点

        q = t;
    }
    L->next->next = NULL;   //原头结点变成尾结点,这里将原头结点置为NULL
    L->next = p;    //连接链表
}

这里是单链表反转的图示过程:

数据结构--单链表反转(图文教程)_第1张图片

数据结构--单链表反转(图文教程)_第2张图片

数据结构--单链表反转(图文教程)_第3张图片

数据结构--单链表反转(图文教程)_第4张图片

这里完整附上代码(主要有new/malloc,一定在delete/free)

#include 
#include 
#include 
using namespace std;

typedef struct Node
{
	char data;
	struct Node *next;		//结构体类型的指针变量,让Node结构体分为数据域L->data和指针域L->next
}Node;

void createAddHead(Node *L);
void reserveLinkList(Node *L);
void deleteList(Node *L);


int main()
{
	Node *L;
	L=new Node;
	L->next=NULL;

	createAddHead(L);
    //reserveLinkList(L);   //逆置链表
	while(L->next!=NULL)
	{
		L=L->next;			//L为头指针,L->data刚开始没有定义值
		cout<data<<" ";

	}
	return 0;
}



void createAddHead(Node *L)
{
	Node *s;
	char c;
	int flag=1;
	while(flag==1)
	{
		c=getchar();
		if(c!='$')
		{
			s=new Node;
			s->data=c;
			s->next=L->next;
			L->next=s;
		}
		else
		{
			flag=0;
		}
	}
}


void reserveLinkList(Node *L)
{
    Node *p,*q,*t;  //*p--前驱指针,*q--当前指针,*t--缓存的下一个结点
    p = L;
    q = L->next;


    if(L==NULL || L->next == NULL || L->next->next ==NULL)
        return ;
    while(q!= NULL)
    {
        t = q->next; //缓存后面的链表

        q->next = p;//逆置
        p = q;  //让p下移一个结点

        q = t;
    }
    L->next->next = NULL;   //原头结点变成尾结点,这里将原头结点置为NULL
    L->next = p;    //连接链表
}

void deleteList(Node *L)
{


    while(L != NULL)
    {
        Node *current = L->next;
        free(L);
        L = current;
    }

}


上面这段代码是我很久以前编写的了,有很多地方还可以优化,但为了节省时间,我就借用这段代码了。

在这里,我先指出一处可以优化的地方,其他可以优化的代码网友有兴趣的话可以放在回复。

typedef struct Node
{
	char data;
	struct Node *next;		//结构体类型的指针变量,让Node结构体分为数据域L->data和指针域L->next
}Node;

刚写单链表反转时,还没有接触到Linux的有关知识。现在了解了一点,发现一个特别厉害的地方,Linux的结构体定义的让人拍案叫绝。

.h文件里

typedef struct _tag_LinkListNode
{
	struct _tag_LinkListNode* next;
}LinkListNode;

.cpp/.c文件里

typedef struct _tag_LinkList
{
	LinkListNode header;
	int length;
}TLinkList;

主程序里(包含main函数)

typedef struct Teacher
{
	LinkListNode node;
	int age;
	char name[64];
}Teacher;

主程序里定义的结构体第一个类型必须要是LinkListNode(名字可以自取)。废话不多说,直接看图:

数据结构--单链表反转(图文教程)_第5张图片

这样就可以实现直接向链表里插入用户自定义的结构体(数据类型),而并不需要重写代码。

 

你可能感兴趣的:(数据结构)