版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37960402/article/details/87816263
最近在为找工作面试做准备,打算补一补数据结构方面的知识。
链表种类:单向链表、单向循环链表、双向链表、双向循环链表
链表的结构:
data(数据) | next(下一个节点的地址) |
---|
基本知识:
1、head:指向第一个节点
2、tail:指向最后一个节点
3、链表的最后一个节点的next总是为空
C/C++:采用”指针+结构体“来实现链表
python:采用”引用+类“实现链表
例1、首先我们要知道如何创建一个链表:
c语言:
#include <stdio.h> //头文件
struct ListNode{
int val; //存储元素数据域
struct ListNode *next; //存储下一个节点的指针域
};
int main()
{
struct ListNode a; //定义节点信息
struct ListNode b;
struct ListNode c;
struct ListNode d;
struct ListNode e;
a.val=10; //元素信息
b.val=20;
c.val=30;
d.val=40;
e.val=50;
a.next=&b;
b.next=&c;
c.next=&d;
d.next=&e;
e.next=NULL; //最后一个元素的next为空
struct ListNode *head=&a;
while(head){ //遍历元素
printf ("%d\n",head ->val);
head=head->next;
}
return 0;
}
结果
例题2----链表逆序
这里的思路
1、创建一个新的链表
循环
2.1、依次遍历每一个节点head
2.2、将每一个节点后的数据即head ->next存放在temp中
2.3、将head ->next=new_head
第一次循环遍历
~~~~~~~~~~~~
由此链表的逆序主要包含三个步骤(一断一连两头改)
1、切断head后面的联系,将head后面的内容放在temp中
temp=head ->next
2、将head与新链表的new_head相连
head->next=new_head
3、两头改,head和new_head的指针重新赋值
new_head=head
head=temp
c语言代码-链表逆序
#include <stdio.h>
struct ListNode{
int val;
struct ListNode *next;
};
struct ListNode *new_head = NULL;
struct ListNode *reverse(struct ListNode *head)
{
while(head){
struct ListNode *temp=head ->next;
head ->next=new_head;
new_head=head;
head=temp;}
return new_head;
}
int main()
{
struct ListNode a ;
struct ListNode b ;
struct ListNode c ;
struct ListNode d ;
struct ListNode e ;
a.val=10;
b.val=20;
c.val=30;
d.val=40;
e.val=50;
a.next=&b;
b.next=&c;
c.next=&d;
d.next=&e;
e.next=NULL;
struct ListNode *head=&a;
new_head=reverse(head);
while(new_head){
printf("%d\n",new_head ->val);
new_head=new_head ->next;
}
return 0;
}
结果如下: