基本概念
线性表是一种逻辑结构,相同数据类型的N个数据元素组成的有序序列
线性表有以下几个特征:
1、数据元素有限
2、逻辑上元素有先后次序
3、数据类型相同
4、仅讨论元素之间的逻辑关系
线性表的分类
1、顺序存储 顺序表—>比如数组
2、链式存储
数组和链表比较
数组
在内存空间必须连续的
查询访问性很强,查找速度快
插入删除效率低。可能浪费内存,内存空间要求高,必须连续的,大小固定,不能动态拓展
链表
在内存中不是连续的
插入删除速度快,内存利用率高,不会浪费内存、大小没有固定,拓展性强
不能随机查找,必须从第一个节点开始遍历,效率低
单链表、双链表、循环链表
单链表 只有后驱没有前驱
双链表有前驱也有后驱
循环链表,头节点上一个节点是尾节点
基本操作
头结点插入
尾结点插入
中间插入
删除
实战
单链表反转
/**
* 单链表反转
* @param head
*/
public static ListNode reverseList(ListNode head)
{
ListNode pre = null; //当前节点的上一个节点
ListNode next = null;//当前节点的下一个节点
while(head!=null)
{
next = head.getNext();
head.setNext(pre);
pre = head;
head = next;
}
return pre;
}
单链表取中间值
public static ListNode getMid(ListNode head)
{
if(head ==null)
{
return head;
}
ListNode fast = head;
ListNode slow = head;
while(fast.getNext() !=null && fast.getNext().getNext()!=null)
{
slow = slow.getNext();
fast = fast.getNext().getNext();
}
return slow;
}