码迷,mamicode.com
首页 > 其他好文 > 详细

LinkList的两种实现方法

时间:2014-09-24 20:00:37      阅读:308      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   java   数据   div   sp   c   log   

   最近一段时间在看算法,发现实现链表有联众方法,本科的时候学习数据结构,对于链表来说,会先建立一个头结点,firstNode,而这个first结点本身是一个node,只不过值域为空,而next域则是指向随后的结点。而在Robert Sedgewick的算法书中,是另一种实现方法,first是一个指针,直接指向真正的第一个结点,而在头部插入新的结点时,先用一个oldFirst结点引用老的first,这样,插入的新节点的next域指向oldFirst,而first指向新的Node,这样不会造成循环。

  1.本科数据结构类型的linklist

  1 package Chapter1_1_3_LinkList;
  2 
  3 import java.util.Iterator;
  4 
  5 public class LinkList<Item> implements Iterable<Item>{
  6     private LinkNode<Item> first;
  7     
  8     private int size;
  9     
 10     
 11 public LinkList(){
 12     first=new LinkNode<Item>();
 13     first.setE(null);
 14     first.setNext(null);
 15     //first=null;
 16     size=0;
 17 }
 18 public void addHeadNode(Item e){
 19     LinkNode<Item> newNode=new LinkNode<Item>();
 20     newNode.setE(e);
 21     newNode.setNext(first.getNext());
 22     first.setNext(newNode);
 23     size++;
 24 }
 25 
 26 public Item removeNode(int n){
 27     LinkNode<Item> index=first;
 28     int i=0;
 29     while(i<n-1&&index.getNext()!=null){
 30         index=index.getNext();
 31         i++;
 32     }
 33     LinkNode<Item> removeNode=index.getNext();
 34     index.setNext(removeNode.getNext());
 35     Item e= removeNode.getE();
 36     
 37     size--;
 38     return e;
 39 }
 40 public void addNode(Item e, int n){
 41     LinkNode<Item> index=first;
 42     int i=0;
 43     while(i<n&&index.getNext()!=null){
 44         index=index.getNext();
 45         i++;
 46     }
 47     LinkNode<Item> newNode=new LinkNode<Item>();
 48     newNode.setE(e);
 49     newNode.setNext(index.getNext());
 50     index.setNext(newNode);
 51     size++;
 52 }
 53 public void addTailNode(Item e){
 54     LinkNode<Item> last=first;
 55     while(last.getNext()!=null)
 56         last=last.getNext();
 57     LinkNode<Item> newNode=new LinkNode<Item>();
 58     newNode.setE(e);
 59     newNode.setNext(last.getNext());
 60     last.setNext(newNode);
 61     size++;    
 62 }
 63 public Item removeHeadNode(){
 64     LinkNode<Item> firstNode=first.getNext();
 65     Item e=firstNode.getE();
 66     first=first.getNext();
 67     size--;
 68     return e;
 69 }
 70 public Item removeTailNode(){
 71     LinkNode<Item> lastpre=first;
 72     LinkNode<Item> last;
 73     while(lastpre.getNext().getNext()!=null)
 74         lastpre=lastpre.getNext();
 75         last=lastpre.getNext();
 76         Item e=last.getE();
 77     lastpre.setNext(null);
 78     size--;
 79     return e;
 80 }
 81 @Override
 82 public Iterator<Item> iterator() {
 83     // TODO Auto-generated method stub
 84     return null;
 85 }
 86 private class LinkListIterator implements Iterator<Item>{
 87     LinkNode<Item> index=first;
 88     
 89     @Override
 90     public boolean hasNext() {
 91         // TODO Auto-generated method stub
 92         if(index!=null)
 93             return true;
 94         else return false;
 95     }
 96 
 97     @Override
 98     public Item next() {
 99         // TODO Auto-generated method stub
100         Item e=index.getE();
101         index=index.getNext();
102         return e;
103     }
104 
105     @Override
106     public void remove() {
107         // TODO Auto-generated method stub
108         System.out.println("no remove");
109     }
110     
111 }
112 }

这部分主要看addHeadNode的方法,其他方法因为原理差不多就没有修正。

2.书中方法实现LinkList

stack:

 1 package Chapter1_1_3_LinkStack;
 2 
 3 public class LinkStack<Item> {
 4 private LinkNode<Item> top;
 5 private int size;
 6 public LinkStack(){
 7     top=null;
 8     size=0;
 9 }
10 public void push(Item e){
11     LinkNode<Item> newNode=new LinkNode<Item>();
12     newNode.e=e;
13     LinkNode<Item> oldTop=top;
14     newNode.next=oldTop;
15     top=newNode;
16     size++;
17 }
18 public Item pop(){
19     if(isEmpty())
20     {
21         System.out.println("Stack is Empty");
22         return null;
23     }
24     Item e=top.e;
25     top=top.next;
26     size--;
27     return e;
28 }
29 public boolean isEmpty(){
30     if(top==null)
31         return true;
32     else return false;
33 }
34 public int getSize(){
35     return size;
36 }
37 }

queue:

 

 1 package Chapter1_1_3_LinkQueue;
 2 
 3 public class LinkQueue<Item> {
 4 private LinkNode<Item> head;
 5 //private LinkNode<Item> tail;
 6 private int size;
 7 public LinkQueue(){
 8     head=null;
 9     //tail=null;
10     size=0;
11 }
12 public boolean isEmpty(){
13     if(head==null)
14         return true;
15     else return false;
16 }
17 public void enqueue(Item e){
18     LinkNode<Item> newNode=new LinkNode<Item>();
19     LinkNode<Item> oldHead=head;
20     newNode.element=e;
21     newNode.next=oldHead;
22     head=newNode;
23     size++;
24 }
25 public Item dequeue(){
26     if(isEmpty())
27     {
28         System.out.println("Queue is Empty");
29         return null;
30     }
31     LinkNode<Item> tail=head;
32     LinkNode<Item> preTail = head;
33     while(tail.next!=null){
34         preTail=tail;
35         tail=tail.next;
36     }
37     
38     Item e=tail.element;
39     preTail.next=tail.next;
40     if(size==1){
41         head=null;
42     }
43     size--;
44     return e;
45 }
46 public int getSize(){
47     return size;
48 }
49 }

 

 

16:00:27

LinkList的两种实现方法

标签:style   blog   color   java   数据   div   sp   c   log   

原文地址:http://www.cnblogs.com/criseRabbit/p/3990932.html

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