单向链表:形象点就是以上那个鬼东西!
它是由一系列的节点串联成的。
而在其节点中包含两部分:1.数据域 2.下一个节点
而下一个节点的能使节点串联的关键
以下是节点的内容:
// <T> 表示泛型 public class Node <T> { //数据域 public T data; //下一个节点 public Node next; //构造函数 Node(T data) { super(); this.data=data; } }
而这里的下一个节点相当于c++中的指针,它指向下一个节点!
以下是链表的一些功能实现,并添加了详细的注释:
(特别注意的是有一些功能的实现要将第一个节点分开独立判断的!)
public class Link <T> { //头节点 private Node head; //尾节点 private Node tail; //大小 private int size=0; //添加元素 public void add(T elem) { Node node = new Node(elem); //添加第一个节点,头尾节点都是(指向)它 if(size==0) { head=node; tail=node; } else { //尾节点的下一个指向新的节点 tail.next=node; //新的节点变成尾节点 tail=node; } size++; } //去除某位置的元素 public void remove(int index) { Node last=head; //判断是否为第一个节点 if(index==0) { head=last.next; last=null; } else if(index>0&&index<size){ //遍历找到index位置的节点、它的上一个节点和它的下一个节点 for(int i=0;i<index-1;i++) { last=last.next; } //index位置的节点 node Node node=last.next; //node的下一个节点 nextNode Node nextNode=node.next; //node上一个节点跳过node指向node的下一个节点 last.next=nextNode; //node 指向空 node.next=null; } size--; } // public T remove2(int index) { if(index<0||index>=size||size==0) return null; size--; if(index==0) { Node node=head; head=node.next; node=null; if(size==0) { tail=null; } return (T)node.data; }else{ Node last=head; for(int i=0;i<index-1;i++) { last=last.next; } Node node=last.next; Node nextNode=node.next; last.next=nextNode; node.next=null; if(index==size-1) { tail=last; } return (T)node.data; } } //改变某位置的data public void change(int index,T elem) { Node last=head; //同样,判断是否为第一个 if(index==0) { last.data=elem; } else if(index>0&&index<=size){ //遍历找到index位置的节点 for(int i=0;i<index-1;i++) { last=last.next; } //找到node Node node=last.next; //将elem赋值给它的数据域 node.data=elem; } } //查询某个值在链表中的位置 public void find(T elem) { //index记录节点位置 int index=0; //判断是否有要查的元素的标志 int flag=0; //遍历 for(Node node =head;node!=null;node=node.next) { //找到元素 if(node.data==elem) { //输出位置 System.out.println("index="+index); //完成有盖元素的判断 flag=1; } index++; } //有无该元素? if(flag==0) System.out.println("该链表中无此元素"); } //查找某个位置的值 public T find(int index) { if(index<0||index>size||size==0) return null; Node node=head; for(int i=0;i<index;i++) { node=node.next; } return (T)node.data; } //插入 public void insert(int index,T elem) { if(index==0) { Node newNode = new Node(elem); newNode.next=head; head=newNode; } else{ Node last = head; for(int i=0;i<index-1;i++) { last=last.next; } Node node=last.next; Node newNode=new Node(elem); last.next=newNode; newNode.next=node; } } //输出链表 public void showInfo() { //判断 if(size>0) { //遍历输出元素 for(Node node=head;node!=null;node=node.next) { System.out.print(node.data+" "); } } System.out.println(); } //递归法输出链表 public void showInfo2(Node node) { if(size>0){ //输出 System.out.print(node.data+" "); //递归调用 if(node.next!=null) showInfo2(node.next); } } //为了方便重载函数(因为head类型为private) public void showInfo2() { showInfo2(head); System.out.println(); } public int getSize() { return size; } public static void main(String [] args) { Link<Integer> link=new Link<Integer>(); for(int i=0;i<10;i++) { link.add(i); } link.showInfo(); // System.out.println("size="+link.getSize()); // link.remove(123); // link.showInfo(); // link.change(3, 100); // link.showInfo(); // link.find(1000); link.insert(0, 1000); link.showInfo2(); System.out.println(link.find(3)); } }