数组与链表的区别
数组与链表均为线性表,即一个元素的前继或后驱只有一个元素,为数据结构的基础。
其中数组与链表相比,数组具有按索引查询方便的特点,其查询的时间复杂度为o(1),而链表查询时最坏情况时,所查元素位于链表末端,需查询n次,时间复杂度为o(n)。
链表则具有插入删除方便的特点,无论在什么位置插入,只需将将其next指针改变即可,不需要改变其他元素的位置,而对于数组,则需将其后继元素全部向后移动一个单位,再将元素填入。
链表的创建及其插入删除
链表在创建前,需要定义node的结构体,设置其get、set方法
node的构成有next指针域,和data数据域。
class Node{
public Node next;
public void setData(Object data) {
this.data = data;
}
private Object data;
public Object getData() {
return data;
}
public Node(Object data) {
this.data = data;
}
public Node(){}
}
结点创建结束后,进行链表的创建,链表创建时一般定义其“头结点”或“根节点”。它无具体数据,用来表示第一个元素。
class Linkedlist {
//链表的根节点,便于使用链表,无数据
private Node root;
链表的初始化:
public void initLink(){
//初始化链表,创建根节点
root=new Node();
root.next=null;
}
链表的添加方法,(该方法采用头插法,即在头结点之后插入)
public void link_add(Object data){
//采用头插法,根节点指向null,新节点的next指向根节点的next,根节点的next指向新节点
Node pnode=new Node(data);
pnode.next=root.next;
root.next=pnode;
System.out.println("数据:"+data+"添加成功");
}
链表的插入方法,根据插入的位置进行结点变更,然后进行插入:
public void link_insert(int index,Object data){
Node pnode=new Node(data);
Node node=this.root;
//node为所插结点的前继结点
int i=1;
while (i<index){
node=node.next;
i++;
}
pnode.next=node.next;
node.next=pnode;
System.out.println("插入成功");
}
链表的删除方法,根据要删除的数据内容进行比较,若无数据则抛出异常:
public void link_delete(Object data){
//删除数据为data的结点
//定义node为删除结点的前结点
Node node=new Node();
node=this.root;
try {
while(node.next.getData()!=data&&node.next!=null){
node=node.next;
}if(node.next.getData()==data){
node.next=node.next.next;
System.out.println("删除成功");
}else if(node.next==null) System.out.println("数据不存在");
}catch (Exception e){
System.out.println("数据不存在");
}
}
链表打印,因添加时为头插法,因此与插入顺序相反:
public void link_print(Linkedlist linkedlist){
// 链表遍历,由于采用头插法,最后元素的next为null,因此while next等于空时退出循环
Node node = linkedlist.root;
while(node.next!=null){
System.out.println(node.next.getData());
node=node.next;
}
完整代码:
package List;
class Node{
public Node next;
public void setData(Object data) {
this.data = data;
}
private Object data;
public Object getData() {
return data;
}
public Node(Object data) {
this.data = data;
}
public Node(){}
}
class Linkedlist {
//链表的根节点,便于使用链表,无数据
private Node root;
public void initLink(){
//初始化链表,创建根节点
root=new Node();
root.next=null;
}
public void link_add(Object data){
//采用头插法,根节点指向null,新节点的next指向根节点的next,根节点的next指向新节点
Node pnode=new Node(data);
pnode.next=root.next;
root.next=pnode;
System.out.println("数据:"+data+"添加成功");
}
public void link_insert(int index,Object data){
Node pnode=new Node(data);
Node node=this.root;
//node为所插结点的前继结点
int i=1;
while (i<index){
node=node.next;
i++;
}
pnode.next=node.next;
node.next=pnode;
System.out.println("插入成功");
}
public void link_delete(Object data){
//删除数据为data的结点
//定义node为删除结点的前结点
Node node=new Node();
node=this.root;
try {
while(node.next.getData()!=data&&node.next!=null){
node=node.next;
}if(node.next.getData()==data){
node.next=node.next.next;
System.out.println("删除成功");
}else if(node.next==null) System.out.println("数据不存在");
}catch (Exception e){
System.out.println("数据不存在");
}
}
public void link_print(Linkedlist linkedlist){
// 链表遍历,由于采用头插法,最后元素的next为null,因此while next等于空时退出循环
Node node = linkedlist.root;
while(node.next!=null){
System.out.println(node.next.getData());
node=node.next;
}
System.out.println("--------------------------");
}
public static void main(String[] args) {
Linkedlist linkedlist=new Linkedlist();
linkedlist.initLink();
linkedlist.link_add(1);
linkedlist.link_add(2);
linkedlist.link_add(3);
linkedlist.link_print(linkedlist);
linkedlist.link_delete(2);
linkedlist.link_print(linkedlist);
linkedlist.link_delete(5);
linkedlist.link_print(linkedlist);
linkedlist.link_insert(2,5);
linkedlist.link_print(linkedlist);
}
}
输出结果: