链表作为最基本的数据结构,在程序设计中有着非常重要的作用,其存储特点如下:可以用任意一组存储单元来存储单链表中的数据元素(存储单元可以是不连续的),而且,除了存储每个数据元素ai的值以外,还必须存储指示其直接后继元素的信息。这两部分信息组成的数据结构元素ai的存储映像称为结点。N个结点链在一起被称为链表,当结点只包含其后继结点的信息的链表就被称为单链表,在内存中存储的方式如下图:
1.链表基础操作
链表最重要的操作就是向链表中插入和删除元素。
单链表的插入操作是将值为x的新结点插入到单链表的第i个结点的位置上,即插入到数据元素ai-1与ai之间。
具体步骤如下:
- 找到ai的引用 p
- 生成一个数据域为x的新结点s。
- 设置p.next=s。
- 设置s.next=a。
示意图如下:
单链表的删除操作是将单链表的第i个结点删去。其具体步骤如下:
1.找到ai-1的存储位置p
2.令p.next指向ai的直接后续结点(即把i从链上摘下)ai+1
下面我将给出链表基础操作的代码:
1 | package mianshi; |
运行结果:
before order:
3 2 4 1 5
after order:
1 2 3 4 5
after delete first:
2 3 4 5
2.删除链表中重复元素
本方法主要思路是对链表进行双重循环遍历,外循环正常遍历链表,内循环从头结点开始遍历,如果碰到和当前结点结点值相同则删除这个节点。
1 | public void deleteduplecate(){ |
3.如何检测一个链表是否有环
定义两个指针fast和slow,fast是快指针,slow是满指针,二者的初始值都指向链表头,slow每次进行一步,fast每次进行两步,两个指针同时向前移动,快指针每次都要和慢指针比较,直到当快指针等于慢指针为止,就证明这个链表有环,否则无环(fast先到尾部为null)
代码如下:
1 | public boolean isloop(Node head){ |
4.链表的反转
1 | public void reverseIteatively(Node head){ |
5.从尾到头输出链表
1 | public void printlistReversely(Node plisthead){ |
6.两个有序单链表合并
1 | public class Node { |