实现链表

结点类

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
清空链表

你可能感兴趣的:(数据结构)