鏈表逆序(JAVA實現)

題目:將一個有鏈表頭的單向單鏈表逆序node

分析:測試

  1. 鏈表爲空或只有一個元素直接返回;
  2. 設置兩個先後相鄰的指針p,q,使得p指向的節點爲q指向的節點的後繼;
  3. 重複步驟2,直到q爲空;
  4. 調整鏈表頭和鏈表尾;

圖解:this

  以鏈表A->B->C->D爲例,逆序此鏈表。spa

  0.初始狀態                                                        1.2.3 循環部分指針

  p = head->next;                                              while(q!=null){code

  q = head->next->next;                                      t = q->next;blog

  t = null;                                                            q->next = p;get

                              p = q;class

                                                                              q = t;List

                           }

 

0.初始狀態

1.第一次循環

2.第二次循環

3.第三次循環

4.q==null循環結束

   head->next->next = null;//設置鏈表尾

 head-next = p;//修改鏈表頭

 

實現及測試代碼

節點Node類:

package linkList.reverse;

/**
 * 鏈表節點
 * @author Administrator
 *
 */
public class Node {
    private Integer data;//節點數據域
    private Node next;//節點指針域
    public Integer getData() {
        return data;
    }
    public void setData(Integer data) {
        this.data = data;
    }
    public Node getNext() {
        return next;
    }
    public void setNext(Node next) {
        this.next = next;
    }
}

逆序方法:

/**
     * 
     * @param node 原始鏈表頭節點
     * @return 逆序後鏈表頭節點
     */
     Node reverseList(Node head){
        //若是鏈表爲空或只有一個元素直接返回
        if(head.getNext()==null||head.getNext().getNext()==null){
            return head;
        }
        Node p = head.getNext();
        Node q = head.getNext().getNext();
        Node t = null;
        while(q!=null){
            t = q.getNext();
            q.setNext(p);
            p = q;
            q = t;
        }
        //設置鏈表尾
        head.getNext().setNext(null);
        //修改鏈表頭
        head.setNext(p);
        return head;
    }

測試代碼:

//表頭
        Node head = new Node();
        head.setData(-1);
        head.setNext(null);
        
        //定義指針
        Node p;
        
        p = head;
        
        //初始化鏈表數據[1~10]
        for(int i=1;i<=10;i++){
            Node q = new Node();
            q.setData(i);
            q.setNext(null);
            p.setNext(q);
            p = q;
        }
        
        //輸出原始鏈表
        printList(head);
        
        System.out.println("");
        
        //輸出逆序後的鏈表
        printList(reverseList(head));
相關文章
相關標籤/搜索