data域:存储数据元素信息的域称为数据域;
next域:存储直接后继位置的域称为指针域,它是存放结点的直接后继的地址(位置)的指针域(链域)。
data域+ next域:组成数据ai的存储映射,称为结点;
Java代码如下
class Node{
private int data;
private Node next;
public Node(int data){
this.data = data;
}
public Node(int data,Node next){
this.data = data;
this.next = next;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
遍历反转法: 基本思路是:将当前节点cur的下一个节点 cur.getNext()缓存到temp后,然后更改当前节点指针指向上一结点pre。也就是说在反转当前结点指针指向前,先把当前结点的指针域用tmp临时保存,以便下一次使用,其过程可表示如下:
pre:上一结点
cur: 当前结点
tmp: 临时结点,用于保存当前结点的指针域(即下一结点)
代码如下:
public class Test {
public static Node reverse(Node node){
if(null==node){
return node;
}
Node preNode = node; //当前节点指针 向前移动一个位置
Node currentNode = node.getNext(); //原有下个节点的指针位置 移动到当前节点
Node tempNode = null; //临时结点,用于保存当前结点的指针域(即下一结点)
while(null!=currentNode){
tempNode = currentNode.getNext();// 指向下一个节点
currentNode.setNext(preNode); // 反转指针域的指向
preNode = currentNode; // preNode 指针往下移动
currentNode = tempNode; // curNode指针向后移动
}
node.setNext(null); //最后将原链表的头节点的指针域置为null,还回新链表的头结点,即原链表的尾结点
return preNode;
}
public static void main(String[] args) {
Node n1 = new Node(3);
Node n2 = new Node(2);
Node n3 = new Node(1);
n1.setNext(n2);
n2.setNext(n3);
Node node = n1;
while(null!=node){
System.out.print(node.getData());
node = node.getNext();
}
System.out.println("\n------反转------");
Node temp = reverse(n1);
while(null!=temp){
System.out.print(temp.getData());
temp = temp.getNext();
}
}
}