2016.06.06
上课内容:链表
前面我们有讲到数组队列,知道它的优点是查询快,元素是整块添加的,而与数组列表相反,链表添加很快,比较方便插入和删除操作,但它查询慢,元素是离散的。
链表由一系列结点组成,结点可以在运动时动态生成。每个结点包括两个部分:一个是存储数据结构的数据域,另一个是存储下一个结点地址的指针。
下面我们来介绍俩种链表。
单链表:由两部分组成:
一个是结点的数据,用data表示。
另一个是结点指向的地址,用next表示。
我们从一个根节点开始,它有一个data,当我们需要再建立一个节点时,把next指向下一个节点的地址,这样就达到了连接的效果。链表的好处就在于当创建一个节点时,就会开辟一段内存空间,删除一个节点时,就会释放一段内存空间。这样大大节省了内存空间。
双向链表:由三部分组成:
一个是该节点的数据,用data表示。
一个存储直接子节点地址,一般称为右链域。 一个存储直接父节点地址,一般称之为左链域。
下面我们举例说明:
public class Manager {
public static void main(String[] arg){
//创建一个字符串的链表
MyLinkList<String> list = new MyLinkList<String>();
//添加字符串
list.add("hello");
list.add(" ");
list.add("world");
//获取所有的元素并且输出
for(int i=0; i<list.getLength(); i++){
System.out.print(list.get(i));
}
}
}
public class Node<E> {
//保存数据
E data;
//下一个节点
Node<E> next;
//根据数据新建节点
Node(E e){
data = e;
}
//无参的构造方法
Node(){
}
}
public class MyLinkList<E> implements MyList<E>{
//长度
private int size;
//头节点
private Node<E> head;
//尾节点
private Node<E> tail;
@Override
public void add(E e) {
//新建一个节点
Node<E> newNode = new Node<E>(e);
if(size == 0){//如果是第一个节点
//头节点和尾节点都指向第一个节点
head = newNode;
tail = newNode;
}else{
//把新节点添加到末尾
tail.next = newNode;
//把尾节点修改为新节点
tail = newNode;
}
//长度+1
size++;
}
@Override
public void delete(int index) {
// TODO Auto-generated method stub
}
@Override
public int getLength() {
// TODO Auto-generated method stub
return size;
}
@Override
public void update(int index, E newE) {
// TODO Auto-generated method stub
}
@Override
public E get(int index) {//从头节点开始往后一个个的查询
//新建一个节点,等于头节点
Node<E> node = head;
for(int i=0; i<index; i++){
//往后移动一个
node = node.next;
}
return node.data;
}
}
public interface MyList<E>{
/**
* 添加一个元素
* @param e 需要添加的元素
*/
public void add(E e);
/**
* 删除指定位置的元素
* @param index 需要删除元素的下标
*/
public void delete(int index);
/**
* 获取元素个数
* @return 元素的个数
*/
public int getLength();
/**
* 修改指定下标的元素
* @param index 需要修改的元素下标
* @param newE 新的元素
*/
public void update(int index,E newE);
/**
* 获取指定下标的元素
* @param index 元素下标
* @return 需要获取的元素
*/
public E get(int index);
}
public class test {
public Node createlink() {
Node root = new Node();
String s0 = "a";
Object o = (String) s0;
root.data = o;
Node next1 = new Node();
String s1 = "b";
Object o1 = (String) s1;
next1.data = o1;
Node next2 = new Node();
String s2 = "c";
Object o2 = (String) s2;
next2.data = o2;
Node next3 = new Node();
String s3 = "d";
Object o3 = (String) s3;
next3.data = o3;
Node next4 = new Node();
String s4 = "e";
Object o4 = (String) s4;
next4.data = o4;
Node next5 = new Node();
String s5 = "f";
Object o5 = (String) s5;
next5.data = o5;
root.next = next1;
next1.next = next2;
next2.next = next3;
next3.next = next4;
next4.next = next5;
return root;
}
public void println(Node root) {
int i = 1;
while (null != root) {
Object data = root.data;
root = root.next;
System.out.println("第" + i + "个节点是" + data);
i++;
}
}
public Node delet(Node root, int index) {
if (index == 1) {
root = root.next;
return root;
} else {
Node temp=root;
for (int i = 1; i < index - 1; i++) {
root = root.next;
}
root.next = root.next.next;
return temp;
}
}
public static void main(String[] args) {
test te = new test();
Node root = te.createlink();
te.println(root);
root=te.delet(root, 3);
te.println(root);
}
}