單鏈表是一種常見的數據結構,由一個個節點通過指針方式連接而成,每個節點由兩部分組成:一是數據域,用於存儲節點數據。二是指針域,用於存儲下一個節點的地址。在Java中定義如下:
public class Node {
private Object data;//數據域
private Node next;//指針域
public Node(Object data){
this.data = data;
}
public Node(Object data,Node next){
this.data = data;
this.next = next;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
單鏈表的反轉操作是面試java開發中常考的題目,筆者面試時曾被這道題虐過qaq,之後痛定思痛,研究了一番之後,寫出來與大家分享。
先說下思路:所謂的單鏈表反轉,就是把每個節點的指針域由原來的指向下一個節點變爲指向其前一個節點。但由於單鏈表沒有指向前一個節點的指針域,因此我們需要增加一個指向前一個節點的指針pre,用於存儲每一個節點的前一個節點。此外,還需要定義一個保存當前節點的指針cur,以及下一個節點的next。定義好這三個指針後,遍歷單鏈表,將當前節點的指針域指向前一個節點,之後將定義三個指針往後移動,直至遍歷到最後一個節點停止。
OK,說完思路,直接上代碼。
public static Node reverseListNode(Node head){
//單鏈表爲空或只有一個節點,直接返回原單鏈表
if (head == null || head.getNext() == null){
return head;
}
//前一個節點指針
Node preNode = null;
//當前節點指針
Node curNode = head;
//下一個節點指針
Node nextNode = null;
while (curNode != null){
nextNode = curNode.getNext();//nextNode 指向下一個節點
curNode.setNext(preNode);//將當前節點next域指向前一個節點
preNode = curNode;//preNode 指針向後移動
curNode = nextNode;//curNode指針向後移動
}
return preNode;
}