題目:將一個有鏈表頭的單向單鏈表逆序node
分析:測試
圖解: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));