鏈表逆序(JAVA實現)


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

分析:

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

圖解:

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

  0.初始狀態                                                        1.2.3 循環部分

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

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

  t = null;                                                            q->next = p;

                              p = q;

                                                                              q = t;

                           }

 

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));

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM