带头节点的链表以及使用链表实现栈:java语言

链表实现

节点类


package link_list;

public class ListNode {
	private int data;
    private ListNode next;
    
    public ListNode(){
    }
    public ListNode(int data){
    	this.data=data;
    }
	public void setData(int data){
    	this.data=data;
    }
    public int getData(){
    	return data;
    }
    public void setNext(ListNode next){
    	this.next=next;
    }
	public ListNode getNext() {
		// TODO Auto-generated method stub
		return next;
	}
}

链表类

package link_list;

public class LinkList {
    public ListNode head=new ListNode(0);//使用具有空节点的链表
    
    public void addToHead(int n){
    	ListNode add=new ListNode(n);
    	add.setNext(head.getNext());
    	head.setNext(add);
    }
    
    public void addToTail(int n){
    	ListNode add=new ListNode(n);
    	ListNode p=head;
    	while((p.getNext()).getNext()!=null){//容易丢一个getNext() 注意最后一次循环
    		p=p.getNext();
    	}
    	(p.getNext()).setNext(add);
    }
    
    public boolean addAfterNth(int n,int addData){
    	ListNode add=new ListNode(addData);
    	if(n<=0) return false;
    	ListNode p=head;
    	int count=0;//计数 P指到第几个数
    	while(count<n){
    		p=p.getNext();
    		count++;
    		if(p==null) return false;
    	}
    	add.setNext(p.getNext());
    	p.setNext(add);
    	return true;
    }//在第n个数据后面插入新数据
    
    public int length(){
    	ListNode p=head.getNext();
    	int count=0;
    	while(p!=null){
    		count++;
    		p=p.getNext();
    	}
    	return count;
    }//遍历求长
    
    public void printDatas(){
    	ListNode p=head.getNext();
    	while(p!=null){
    		System.out.print(p.getData()+" ");
    		p=p.getNext();
    	}
    	System.out.println();
    }
}

测试类

package link_list;

public class TestLinkList {
	public static void main(String[] args){
    	LinkList l=new LinkList();
    	System.out.println("初始长度为:"+l.length());
    	l.addToHead(2);
    	l.addToHead(3);
    	System.out.print("数据依次为:");
    	l.printDatas();
    	l.addToTail(44);
    	l.addToTail(5);
    	System.out.print("数据依次为:");
    	l.printDatas();
    	l.addAfterNth(4, 222);
    	l.addAfterNth(1, 22);
    	System.out.print("数据依次为:");
    	l.printDatas();
    	System.out.println("当前长度为:"+l.length());
    }
}

输出如下:

初始长度为:0
数据依次为:3 2
数据依次为:3 2 44 5
数据依次为:3 22 2 44 5 222
当前长度为:6

栈实现

链表栈类

将头结点一端作为top,实现栈的三个主要方法:
pop:删除第一个节点并取出值(写的时候忘记返回数值了,懒得改了)
getTop:获取top端第一个节点的值
push:向top端压入新数据,实现方法为单链表中的头插法

package link_list;

public class LinkListStack {
	public ListNode head=new ListNode(0);
	
	public void push(int n){
    	ListNode add=new ListNode(n);
    	add.setNext(head.getNext());
    	head.setNext(add);
    }//链表头插
	
	public boolean pop(){
	    if(head.getNext()==null) return false;
	    else{
	    	head.setNext(head.getNext().getNext());
	    	return true;
	    }
	}
	
	public int getTop(){
		if(head.getNext()==null) return -11111;
		return (head.getNext()).getData();
	}
}

链表栈的测试类

package link_list;

public class TextLLStack {
    
    public static void main(String[] args){
    	LinkListStack stack=new LinkListStack();
    	stack.push(2);
    	stack.push(1);
    	stack.push(-1);
    	for(int i=0;i<3;i++){
    		System.out.println(stack.getTop());
    		stack.pop();
    	}
    }
}

输出结果如下:
-1
1
2
-11111

发布了14 篇原创文章 · 获赞 0 · 访问量 307

猜你喜欢

转载自blog.csdn.net/zmx1952822326/article/details/100714366