编程题之--链表反置

  对链表进行反置。例如:

  [1] -> [2] -> [3] -> [null]

变成:

  [3] -> [2] -> [1] -> [null]

我的思路如下:

  顺着链表循环一次,当走到某个节点上时,把当前节点的next设为上一个节点,但是,为了不丢失下一个节点的引用,需要在设置next为上一个节点之前,用一个临时变量保存下个节点的引用,具体过程如下,链表长度为3:其中(p)、(c)、(n)下标分别表示previous,current,next,即上一个,当前和下一个节点。

参考代码:

1) LinkNode.java

 1 public class LinkNode<T> {
 2 
 3     private T data;
 4     private LinkNode<T> next = null;
 5 
 6     public LinkNode(T data) {
 7         this.data = data;
 8         this.next = null;
 9     }
10 
11     public T getData() {
12         return data;
13     }
14 
15     public void setData(T data) {
16         this.data = data;
17     }
18 
19     public boolean hasNext() {
20         return this.next != null;
21     }
22 
23     public LinkNode<T> getNext() {
24         return next;
25     }
26 
27     public void setNext(LinkNode<T> next) {
28         this.next = next;
29     }
30 
31     public void display() {
32         System.out.printf(" {%s} ", data.toString());
33     }
34     
35 }

2) LinkList.java,链表反置的函数为下面代码中的reverse()函数。

 1 public class LinkList<T> {
 2 
 3     private LinkNode<T> first;
 4 
 5     public LinkList() {
 6         this.first = null;
 7     }
 8 
 9     public boolean isEmpty() {
10         return this.first == null;
11     }
12 
13     public LinkNode<T> getFirst() {
14         return first;
15     }
16 
17     public void setFirst(LinkNode<T> first) {
18         this.first = first;
19     }
20 
21     public void insertFirst(T newEle) {
22         LinkNode<T> tLinkNode = new LinkNode<>(newEle);
23         tLinkNode.setNext(first);
24         first = tLinkNode;
25     }
26 
27     public void displayList() {
28         System.out.println("List(first-->last): ");
29         LinkNode<T> current = first;
30         while (current != null) {
31             current.display();
32             current = current.getNext();
33         }
34         System.out.println(" ");
35     }
36 
37     public void reverse() {
38         if (this.first == null) {
39             return;
40         }
41         LinkNode<T> previous = null;
42         LinkNode<T> current = this.first;
43         LinkNode<T> next = current.getNext();
44 
45         while (current != null) {
46             current.setNext(previous);
47 
48             previous = current;
49             current = next;
50             next = current != null ? current.getNext() : null;
51         }
52         this.first = previous;
53     }
54 
55     public static void main(String[] args) {
56         LinkList<Integer> linkList = new LinkList<>();
57         linkList.insertFirst(5);
58         linkList.insertFirst(4);
59         linkList.insertFirst(3);
60         linkList.insertFirst(2);
61         linkList.insertFirst(1);
62         linkList.displayList();
63 
64         linkList.reverse();
65         linkList.displayList();
66 
67     }
68 }

 

下面介绍一下其他思路:

  [1] -> [2] -> [3] -> [null]

变成:

  [3] -> [2] -> [1] -> [null]

  思路1:创建一个新的链表,把原来链表上节点逐个拆下来,然后作为头结点插入到新链表中,新链表即为反转后的链表

 1     public LinkList<T> reverseNew() {
 2         LinkList<T> reverse = new LinkList<>();
 3         LinkNode<T> current = this.first;
 4         while (current != null) {
 5             this.deleteFirst();
 6             reverse.insertFirst(current);
 7             current = this.first;
 8         }
 9         return reverse;
10     }

 

posted @ 2017-07-14 23:18  tlz888  阅读(316)  评论(0编辑  收藏  举报