码迷,mamicode.com
首页 > 编程语言 > 详细

用结点实现链表LinkedList,用数组和结点实现栈Stack,用数组和结点链表实现队列Queue

时间:2016-05-07 09:16:41      阅读:256      评论:0      收藏:0      [点我收藏+]

标签:

一,用结点实现链表LinkedList,不用换JavaAPI的集合框架

import java.util.Scanner;

public class Main {
    public static class Node {
    	int data;
    	Node next=null;
    	public Node(int data){this.data=data;};
    }
    public static class MyLinkedList {
    	Node head=null;
    	
    	public MyLinkedList() {
					
		}
        //添加节点
		public void addNode(int d){
    		Node newNode=new Node(d);
    		if(head==null){
    			head=newNode;
    			return ;
    		}
    	 Node tmp=head;
    	 while(tmp.next!=null){//找到结尾
    		 tmp=tmp.next;
    	 }
    		tmp.next=newNode;   		
    	}
		//链表长度
		public int size(Node head){
			int count=0;
			Node tmp=head;
			while(tmp.next!=null){
				count++;
				tmp=tmp.next;
			}
			return count+1;
		}
		//删除节点
		public boolean deleteNode(int d){
			if(head.data==d){
				head=head.next;
				return true;
			}
			Node preNode=head;
			Node curNode=head.next;
			while(curNode!=null){
				if(curNode.data==d){
					preNode.next=curNode.next;
					return true;
				}
				preNode=curNode;
				curNode=curNode.next;
			}
			return false;
		}
		
		//对链表进行排序,返回排序后的头结点
		public Node orderList(){
			Node nextNode=null;
			int temp=0;
			Node curNode=head;
			while(curNode.next!=null){
				nextNode=curNode.next;
				while(nextNode!=null){
					if(curNode.data>nextNode.data){//只交换数据
						temp = curNode.data;
						curNode.data=nextNode.data;
						nextNode.data=temp;
					}
					nextNode=nextNode.next;
				}
				curNode=curNode.next;
			}
			//选择排序算法
			/*while(curNode.next!=null){
				nextNode=curNode.next;
				Node k=curNode;
				int tmp=curNode.data;
				while(nextNode!=null){
					if(nextNode.data<tmp){
						 tmp=nextNode.data;
						 k=nextNode;
					}
					nextNode=nextNode.next;
				}
				if(k!=curNode){
					int t=k.data;
					k.data=curNode.data;
					curNode.data=t;
				}
				curNode=curNode.next;				
			}*/
		return head;			
		}
		//打印链表
		public void printList(){
			Node tmp=head;{
				while(tmp!=null){
					System.out.print(tmp.data+" ");
					tmp=tmp.next;					
				}
			}
		}
		
		
    }
    
	public static void main(String[] args) {
		 Scanner in=new Scanner(System.in);
		 int n=in.nextInt();
		 int[] nodes=new int[n];
		 for(int i=0;i<n;i++){
			 nodes[i]=in.nextInt();
		 }
         int k=in.nextInt();
         MyLinkedList list=new MyLinkedList();
         for(int i=0;i<n;i++){
        	 list.addNode(nodes[i]);
		 }
         //LinkedList list2=new LinkedList();
         
         Node p=FindKthToTail(list.head,k);
         System.out.println(p.data);
	}
	//单链表找到倒数第k个数
	public static Node FindKthToTail(Node head,int k){
		if(k<=0||head==null){
			return null;
		}
		Node p1=head;
		Node p2=head;
		for(int i=0;i<k+1;i++){//先走k步
			p1=p1.next;
		}
		while(p1!=null){
			p1=p1.next;
			p2=p2.next;
		}
		return p2;
	}
}
二,实现栈Stack

1,使用一般的数组Object[]实现栈

import java.util.Arrays;


public class Main {
  public static class MyStack<E>{
	  private Object[] stack;//用数组实现栈
	  private int size;//数组的大小
	  public MyStack(){
		  stack=new Object[10];
	  }
	  public boolean isEmpty(){
		  return size==0;
	  }
	  
	  public E peek(){
		  if(isEmpty()){
			  return null;
		  }
		  return (E) stack[size-1];		  
	  }
	  
	  public E pop(){
		   E e=peek();
		   stack[size-1]=null;
		   size--;
		   return e;		  
	  }
	  public boolean push(E item){
		  ensureCapacity(size+1);
		  stack[size++]=item;
		  return true;
	  }
	  
	  private void ensureCapacity(int size){
		  int len=stack.length;
		  if(len<size){
			  int newLen=10;
			  stack=Arrays.copyOf(stack, newLen);			  
		  }
	  }
	  
  }
	
	public static void main(String[] args) {
		  MyStack<Integer> s=new MyStack<Integer>();
		  s.push(52);
		  s.push(20);
		  s.push(96);
		  System.out.println("栈中元素个数:"+s.size);
		  System.out.println("栈顶元素:"+s.pop());
		  System.out.println("栈顶元素:"+s.pop());
		  

	}

}
2,使用结点链表实现栈,这是一直在链表头插入,向左扩展。让我们先忽略JavaAPI提供的集合框架,咱主要讨论的是思想

public class Main {
	//节点类
    public static class Node<E>{
    	E data;
    	Node<E> next=null;
		public Node(E data) {		
			this.data = data;
		}    	    	
    }
    
    public static class MyStack<E>{
    	Node<E> top=null;//相当于链表头
    	
      public boolean push(E d){
    		Node<E> newNode=new Node<E>(d);
    		if(top!=null){
    			newNode.next=top;//一直在链表头插入,想左扩展
    		}
    		top=newNode;
    		return true;
    	}
    	public E peek(){
    		if(top==null)
    			return null;
    		return top.data;
    	}
    	public E pop(){
    		E e=peek();
    		top=top.next;
    		return e;
    	}
    	public boolean isEmpty(){
    		return top==null;
    	}
    	public int size(){
    		if(isEmpty()){
    			return 0;
    		}
    		Node<E> tmp=top;
    	    int size=0;
    		while(tmp!=null){
    			size++;
    			tmp=tmp.next;
    		}
    		return size;
    	}
        	
    }
	public static void main(String[] args) {
		  MyStack<Integer> s=new MyStack<Integer>();
		  s.push(52);
		  s.push(20);
		  s.push(96);
		  System.out.println("栈中元素个数:"+s.size());
		  System.out.println("栈顶元素:"+s.pop());
		  System.out.println("栈顶元素:"+s.pop());

	}

}
三,实现队列Queue

1,用数组实现队列,这时用集合框架LinkedList是最好的方法

import java.util.ArrayList;
import java.util.LinkedList;


public class Main {
    public static class MyQueue<E>{
    	private LinkedList<E> queue;//用的是Api的集合框架,为什么要用LinkedList。因为LinkedList有addlast和addFirst方法,可以在两端任意操作,使用ArrayList就比较麻烦
    	private int size=0;
    	public MyQueue(){
    		queue=new LinkedList<E>();
    	}
    	
    	public boolean Enqueue(E e){
    		queue.addLast(e);
    		size++;
    		return true;
    	}
    	public E Dequeue(){
    		size--;
    		return queue.removeFirst();
    	}
    	public boolean Empty(){
    		return size==0;
    	}
    	public int size(){    		
    		return queue.size();
    	}
    	
    	public void printQueue(){
    		System.out.println(queue.toString());
    	}
    	
    }
	public static void main(String[] args) {
		  MyQueue<Integer> q=new MyQueue<Integer>();
		  q.Enqueue(52);
		  q.Enqueue(42);
		  q.Enqueue(71);
		  q.Enqueue(23);
		  q.printQueue();
		  q.Dequeue();
		  q.printQueue();
		  q.Dequeue();
		  q.printQueue();
		  q.Dequeue();
		  q.printQueue();
		  /*
		   * [52, 42, 71, 23]
			 [42, 71, 23]
			 [71, 23]
			 [23]
		   * 
		   * */
		  
		  
		 

	}

}
2,用结点链表实现队列。

public class Main {
	public static class Node<E>{
		E data;
		Node<E> next=null;
		public Node(E data){
			this.data=data;
		}
	}
	public static class MyQueue<E>{
		
		Node<E> head=null,tail=null;
		public boolean Enqueue(E e){
			Node<E> newNode=new Node<E>(e);
			if(head==null&&tail==null){
				head=newNode;
				tail=newNode;
			}
			tail.next=newNode;
			tail=newNode;
			return true;
		}
		public E Dequeue(){
			if(head==null){
				return null;
			}
			E e=head.data;
			head=head.next;
			return e;			
		}
		public boolean isEmpty(){
			return head==tail;
		}
		public int size(){
			Node<E> tmp=head;
			int count=0;
			while(tmp!=null){
				count++;
				tmp=tmp.next;				
			}
			return count;
		}
		
		public void printQueue(){
			Node<E> tmp=head;
			
			while(tmp!=null){
				System.out.print(tmp.data+" ");
				tmp=tmp.next;				
			}
			System.out.println();
    	}
		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		 MyQueue<Integer> q=new MyQueue<Integer>();
		  q.Enqueue(52);
		  q.Enqueue(42);
		  q.Enqueue(71);
		  q.Enqueue(23);
		  q.printQueue();
		  q.Dequeue();
		  q.printQueue();
		  q.Dequeue();
		  q.printQueue();
		  q.Dequeue();
		  q.printQueue();
		/*52 42 71 23 
<span style="white-space:pre">		</span> *42 71 23 
<span style="white-space:pre">		</span> *71 23 
                 *23 */			
	}

}


用结点实现链表LinkedList,用数组和结点实现栈Stack,用数组和结点链表实现队列Queue

标签:

原文地址:http://blog.csdn.net/tuke_tuke/article/details/51331094

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!