链表(四)

假设你要遍历一张链表,然后需要的每个链接点上执行一些操作。例如一张链表存储职工表,需要提高拿最低工资员工的薪水,这样无法做出来。

若是数组,这种操作很容易。可以用数组下标跟踪每个数据项,并进行操作,再指向下一个坐标。链表虽然可以用 find() 找出指定的链接点,但是这种需要频繁比较,而且多次遍历。

1     for(int i = 0 ; i < emps.length; i++){
2         Emp emp = emps[i];
3         if(emp.getSalary() < 1800){
4           emp.setSalary(1800);
5         }
6     }

 

迭代器:迭代器类可以包含对数据结构中的数据项引用,并用来遍历这些结构的对象。

 1 public class Link {
 2 
 3     private int iData;
 4     private double dData;
 5     private Link next;
 6 
 7     public Link(int i, double d) {
 8       this.iData = i;
 9       this.dData = d;
10     }
11 
12     public void displayLink() {
13       System.out.println("{ " + iData + " , " + dData + " }");
14     }
15 
16     public Link getNext() {
17       return next;
18     }
19 
20     public void setNext(Link next) {
21       this.next = next;
22     }
23 
24     public int getiData() {
25       return iData;
26     }
27 
28     public double getdData() {
29       return dData;
30     }
31 
32 }
 1 public class LinkList {
 2 
 3     private Link first;
 4 
 5     public boolean isEmpty() {
 6       return first == null;
 7     }
 8 
 9     public void insertFirst(int i, double d) {
10       Link newLink = new Link(i, d);
11       newLink.setNext(first);
12       first = newLink;
13     }
14 
15     public Link getFirst() {
16       return first;
17     }
18 
19     //这种方式比较危险
20     public void setFirst(Link f) {
21       first = f;
22     }
23 
24     public ListIterator getIterator() {
25       return new ListIterator(this);
26     }
27 
28     public void displayList() {
29       Link current = first;
30       System.out.println("List (First --> Last)");
31       while (current != null) {
32           current.displayLink();
33           current = current.getNext();
34       }
35     }
36 
37 }
 1 public class ListIterator {
 2 
 3     private Link current;
 4     private Link pervious;
 5     private LinkList ourList;
 6 
 7     public ListIterator(LinkList ourList) {
 8         this.ourList = ourList;
 9         reset();
10     }
11 
12     public void reset() {
13         current = ourList.getFirst();
14         pervious = null;
15     }
16 
17     public boolean hasNext() {
18         return (current.getNext() == null);
19     }
20 
21     public void next() {
22         pervious = current;
23         current = current.getNext();
24     }
25 
26     public Link getCurrent() {
27         return current;
28     }
29 
30     public void insertAfter(int i, double d) {
31         Link newLink = new Link(i, d);
32         if (ourList.isEmpty()) {
33             ourList.setFirst(newLink);
34             current = newLink;
35         } else {
36             newLink.setNext(current.getNext());
37             current.setNext(newLink);
38             next();
39         }
40     }
41 
42     public void insertBefore(int i, double d) {
43         Link newLink = new Link(i, d);
44         if (ourList.isEmpty()) {
45             ourList.setFirst(newLink);
46             current = newLink;
47         } else {
48             pervious.setNext(newLink);
49             newLink.setNext(current);
50             current = newLink;
51         }
52     }
53 
54     public Link deleteCurrent() {
55         if (pervious != null) {
56             pervious.setNext(current.getNext());
57             if (hasNext()) {
58                 reset();
59             } else {
60                 current = current.getNext();
61             }
62         } else {
63             ourList.setFirst(current.getNext());
64             reset();
65         }
66         return current;
67     }
68 }
 1     public static void main(String[] args) {
 2       LinkList ll = new LinkList();
 3       ll.insertFirst(10, 10.5);
 4       ll.insertFirst(9, 9.5);
 5       ll.insertFirst(8, 8.5);
 6       ll.insertFirst(7, 7.5);
 7       ll.insertFirst(6, 6.5);
 8       ll.insertFirst(5, 5.5);
 9       ll.displayList();
10       System.out.println("-------------------------");
11       ListIterator iterator = ll.getIterator();
12       while(iterator.hasNext()){
13           iterator.next().displayLink();
14       }
15       System.out.println("-------------------------");
16       iterator.reset();
17       iterator.insertAfter(77, 77.5);
18       iterator.insertBefore(88, 88.5);
19       ll.displayList();
20     }

打印结果:
List (First --> Last)
{ 5 , 5.5 }
{ 6 , 6.5 }
{ 7 , 7.5 }
{ 8 , 8.5 }
{ 9 , 9.5 }
{ 10 , 10.5 }
-------------------------
{ 5 , 5.5 }
{ 6 , 6.5 }
{ 7 , 7.5 }
{ 8 , 8.5 }
{ 9 , 9.5 }
{ 10 , 10.5 }
-------------------------
List (First --> Last)
{ 5 , 5.5 }
{ 88 , 88.5 }
{ 77 , 77.5 }
{ 6 , 6.5 }
{ 7 , 7.5 }
{ 8 , 8.5 }
{ 9 , 9.5 }
{ 10 , 10.5 }

posted @ 2012-11-17 18:43  Kyle_Java  阅读(227)  评论(0编辑  收藏  举报