实现链表

来源:互联网 发布:matlab矩阵乘法代码 编辑:程序博客网 时间:2024/06/14 05:54

结点类

package com.java.LinkList;public class Node {public int data;public Node next;public Node(Node next) {this.next=next;}public Node(int data){this.data=data;}}
链表类

package com.java.LinkList;import com.java.linkStack.linkStack;public class LinkList {private Node head;private Node curnode;public LinkList() {head=new Node(null);curnode=head;}public void addNodeLast(int data){Node node=new Node(data);curnode=head;while(curnode.next!=null){curnode=curnode.next;}curnode.next=node;}public void addFirst(int data){Node node=new Node(data);//创建新节点node.next=head.next;head.next=node;}public void  add(int index,int data){if(index>this.size()||index<0){System.out.println("无法插入数据");return;}int count=0;curnode=head;Node temp=null;if(index==0) this.addFirst(data);else{temp=curnode.next;while(temp!=null){curnode=temp;temp=temp.next;count++;if(count==index){Node node=new Node(data);node.next=curnode.next;curnode.next=node;break;}}}}public void peek(){curnode=head;while(curnode.next!=null){curnode=curnode.next;}System.out.println(curnode.data);}public int size(){int size=0;curnode=head;while(curnode.next!=null){curnode=curnode.next;size++;}return size;}public void display(){curnode=head;while(curnode.next!=null){System.out.println(curnode.next.data);curnode=curnode.next;}}public void addNode(int data1,int data2){Node temp=head;if(temp.next==null)System.out.println("链表为空,找不到"+data1);while(temp.next!=null){if(temp.next.data==data1){Node node=new Node(data2);node.next=temp.next;temp.next=node;break;}if(temp.next.next!=null){temp=temp.next;}else{System.out.println("未找到数据值为"+data1+"的结点");break;}}}public void clear(){if(head.next==null){throw new RuntimeException("链表已经为空");}Node temp=null;while(head.next!=null){ //不断删除头结点,直到头结点的指针域为空temp=head.next;head.next=temp.next;temp.next=null;}}public void deleteFirst(){if(head.next==null){throw new RuntimeException("链表为空,不能删");}Node temp=head.next;head.next=head.next.next;temp.next=null;//方便垃圾回收机制回收}public int get(int index){if(head.next==null){throw new RuntimeException("链表为空");//定义一个指针指向第一个结点}                                       //通过循环向后查找,用一个变量记录循环次数// 当循环次数和指定次数相同时,输出数据if(index>(this.size()-1)||index<0){throw new RuntimeException("该下标的结点不存在");}int count=0;//记录循环次数   curnode=head.next;while(curnode!=null){if(count==index){break;}count++;curnode=curnode.next;}return curnode.data;}public void delete(int index){if(head.next==null){throw new RuntimeException("链表为空");//定义一个指针指向第一个结点}   //通过循环向后查找,用一个变量记录循环次数int count=0;   // 当循环次数和指定次数相同时,删除该结点boolean bl=false;curnode=head;while(curnode.next!=null){if(count==index){Node temp=curnode.next;curnode.next=curnode.next.next;temp.next=null;bl=true;break;}count++;curnode=curnode.next;}if(bl==false)System.out.println("下标超过链表最大下标");}public void deleteNode(int data){Node temp=head;if(temp.next==null)System.out.println("链表为空,删除失败!");while(temp.next!=null){curnode=temp.next;if(curnode.data==data){temp.next=curnode.next;curnode.next=null;break;}if(curnode.next!=null){temp=curnode;curnode=curnode.next;}else{System.out.println("未找到该结点,删除失败!");break;}}}public void overTurnList(){if(head.next==null){throw new RuntimeException("链表为空");}Node curnode=head.next;head.next=null;Node temp=null;while(curnode!=null){temp=curnode.next;curnode.next=head.next;head.next=curnode;curnode=temp;}}}

测试类

package com.java.LinkList;public class Test {public static void main(String[] args) {LinkList linkList=new LinkList();linkList.deleteNode(2);linkList.addNodeLast(3);linkList.peek();linkList.addNodeLast(4);linkList.peek();linkList.addNodeLast(5);linkList.peek();System.out.println("链表长度为"+linkList.size());System.out.println("删除数据值为2的结点");linkList.deleteNode(2);linkList.peek();System.out.println("删除数据值为5的结点");linkList.deleteNode(5);linkList.peek();System.out.println("链表长度为"+linkList.size());linkList.display();System.out.println("在3前插入数据2");linkList.addNode(3, 2);linkList.display();System.out.println("得到第二个结点");System.out.println(linkList.get(1));System.out.println("得到第1个结点");System.out.println(linkList.get(0));System.out.println("头插法插入数据");linkList.addFirst(1);linkList.display();System.out.println("删除第一个结点");linkList.delete(0);linkList.display();System.out.println("删除头结点");linkList.deleteFirst();linkList.display();System.out.println("在第三个结点位置插入1");linkList.add(0, 1);linkList.display();System.out.println("翻转链表");linkList.overTurnList();linkList.display();System.out.println("清空链表");linkList.clear();linkList.display();System.out.println(linkList.size());}}

结果

链表为空,删除失败!
3
4
5
链表长度为3
删除数据值为2的结点
未找到该结点,删除失败!
5
删除数据值为5的结点
4
链表长度为2
3
4
在3前插入数据2
2
3
4
得到第二个结点
3
得到第1个结点
2
头插法插入数据
1
2
3
4
删除第一个结点
2
3
4
删除头结点
3
4
在第三个结点位置插入1
1
3
4
翻转链表
4
3
1
清空链表

原创粉丝点击