数据结构:链表
链表的概念及结构
链表是一种 物理存储结构上非连续 存储结构,数据元素的 逻辑顺序 是通过链表中的 引用链接 次序实现的 。
实际中链表的结构非常多样,以下情况组合起来就有 8 种链表结构:
2. 带头或者不带头
下面让我们来看一下链表的实现吧!
代码:
MySingleList部分:
public class MySingleList {//一个节点代表一个对象,所以用内部内实现static class ListNode{public int val;//节点的值域public ListNode next;//下一个节点的地址public ListNode(int val) {this.val = val;}}public ListNode head;//整个链表的头节点,所以定义在整个链表里面public void creatList(){ListNode node1=new ListNode(13);ListNode node2=new ListNode(34);ListNode node3=new ListNode(45);ListNode node4=new ListNode(47);ListNode node5=new ListNode(56);ListNode node6=new ListNode(67);node1.next=node2;node2.next=node3;node3.next=node4;node4.next=node5;node5.next=node6;this.head=node1;}public void display() {ListNode cur=head;while (cur!=null){//cur==null证明把链表走完了System.out.print(cur.val+" ");cur=cur.next;}}//头插法public void addFirst(int data){ListNode node=new ListNode(data);node.next=head;head=node;}//尾插法public void addLast(int data){ListNode node=new ListNode(data);//找尾ListNode cur=head;if(cur==null){head=node;return;}while (cur.next!=null){cur=cur.next;}cur.next=node;}//任意位置插入,第一个数据节点为0号下标public void addIndex(int index,int data){//判断位置是否合法if(index<0||index>size()){System.out.println("位置不合法");return;}if(index==0){addFirst(data);return;}if (index==size()){addLast(data);return;}ListNode cur=findIndexSubOne(index);ListNode node=new ListNode(data);node.next=cur.next;cur.next=node;}//找要插入节点位置的前一个节点private ListNode findIndexSubOne(int index){ListNode cur=head;while (index-1!=0){cur=cur.next;index--;}return cur;}//查找是否包含关键字key是否在单链表当中public boolean contains(int key){ListNode cur=head;while (cur!=null){if(cur.val==key){return true;}cur=cur.next;}return false;}//删除第一次出现关键字为key的节点public void remove(int key){if(head==null){return;}//单独删除头结点if(head.val==key){head=head.next;return;}ListNode cur=searchPrev(key);if (cur==null){System.out.println("没有你要删除的节点");return;}ListNode del=cur.next;cur.next=del.next;}private ListNode searchPrev(int key){ListNode cur=head;while (cur.next!=null){if(cur.next.val==key){return cur;}cur=cur.next;}return null;}//删除所有值为key的节点public void removeAllKey(int key){if(head==null){return;}ListNode prev=head;ListNode cur=head.next;while(cur!=null){if(cur.val==key){prev.next=cur.next;cur=cur.next;}else {prev=cur;cur=cur.next;}}if(head.val==key){head=head.next;}}//得到单链表的长度public int size(){int count=0;ListNode cur=head;while (cur!=null){count++;cur=cur.next;}return count;}public void clear() {this.head=null;}
}
Test部分
public class Test {public static void main(String[] args) {MySingleList mySingleList=new MySingleList();//mySingleList.creatList();mySingleList.addFirst(12);mySingleList.addFirst(23);mySingleList.addFirst(34);mySingleList.addFirst(23);mySingleList.addFirst(56);System.out.println();System.out.println(mySingleList.size());System.out.println(mySingleList.contains(13));mySingleList.addLast(7);mySingleList.addIndex(3,99);mySingleList.remove(12);mySingleList.removeAllKey(23);mySingleList.clear();mySingleList.display();}
}
对应的结果: