链表中每一个结点包含两部分,一部分存放数据,另一部分存放逻辑上相邻的结点的指针。
说明:1.单链表是通过指向后继结点的指针把它的一串结点连接成一个链。
2.一个单链表是由它的头指针Head来唯一标识。
3.有时为了操作方便加,在第一个节点之前虚加一个“头结点”。头结点的数据域不存放数值,指针域存放指向第一个结点的指针。
↑头指针head指向头结点。
明白单链表的存储结构之后,我们则开始对他进行一系列的操作。
如何对单链表进行操作?我总结了四个步骤------
1.要先创建一个结点类Node,每一个结点对象表示一个数据元素。
2.在创建一个接口IList,里面来定义你要对表进行的操作。
3.创建一个链表类LinkList,来具体实现你对表的操作。
4.创建一个试验类,来测试你写的操作是否符合要求。
步骤一:创建一个结点类Node
public class Node {
public Object data;//存放结点值
public Node next;//存放后继节点的引用
public Node() {
this(null,null);
}
public Node(Object data) {
this(data,null);
}
public Node(Object data, Node next) {
this.data = data;
this.next = next;
}
}
步骤二:创建一个接口IList
public interface IList {
public void clear();
public boolean isEmpty();
public int length();
public Object get(int i) throws Exception;
public void insert(int i,Object x) throws Exception;
public void remove(int i) throws Exception;
public int indexOf(Object x);
public void display();
}
步骤三:创建一个链表LinkList
import java.util.Scanner;
public class LinkList implements IList {
//单链表只需要一个头指针就能唯一表示它,所以但链表类的成员变量只需要设置一个头指针即可
public Node head;//单链表的头指针
public LinkList() {
head = new Node();//初始化头结点
}
public LinkList(int n,boolean Order) throws Exception{
this();
if(Order)
create1(n);
else create2(n);
}
private void create1(int n)throws Exception {
Scanner sc = new Scanner(System.in);
for(int j=0;j<n;j++){
insert(length(),sc.next());
}
}
private void create2(int n)throws Exception {
Scanner sc = new Scanner(System.in);
for(int j=0;j<n;j++)
insert(0,sc.next());
}
@Override
public void clear() {
head.data = null;
head.next = null;
}
@Override
public boolean isEmpty() {
return head.next==null;
}
@Override
public int length() {
Node p = head.next;
int length = 0;
while(p!=null){
p = p.next;
++length;
}
return length;
}
@Override
public Object get(int i) throws Exception {
Node p = head.next;
int j =0;
while(p !=null && j<i){
p = p.next;
++j;
}
if(j>i || p==null){
throw new Exception("第"+i+"个元素不存在");
}
return p.data;
}
@Override
//带头结点的插入数据
public void insert(int i, Object x) throws Exception {
Node p = head;
int j = -1;
while(p != null && j<i-1){
p = p.next;
++j;
}
if(j>i-1 || p==null)
throw new Exception("插入位置不合法");
Node s = new Node(x);
s.next = p.next;
p.next = s;
}
@Override
public void remove(int i) throws Exception {
Node p =head;
int j =-1;
while(p.next!=null && j<i-1){
p =p.next;
++j;
}
if(j>i-1 || p.next == null)
{
throw new Exception("删除位置不合法");
}
p.next = p.next.next;
}
@Override
public int indexOf(Object x) {
Node p = head.next;
int j = 0;
while(p!=null && !p.data.equals(x)){
p = p.next;
++j;
}
if(p!=null)
return j;
else return -1;
}
@Override
public void display() {
Node node = head.next;//取出首结点
while(node != null){
System.out.println(node.data+"");
node = node.next;
}
System.out.println();
}
}
步骤四:创建一个测试类
public class Test {
public static void main(String[] args) throws Exception {
int n = 5;
LinkList linkList = new LinkList();
for(int i = 0;i<n;i++)
linkList.insert(i,i);
linkList.display();
}
}
上面是我的代码逻辑,有需要代码的请私信我【2】即可获得哟~
加油所有人。。。。。。。