实现:
网上的一套前移后移的理解我不是很好理解,通过自己代码debug跑过一遍后,觉得我用新旧单链表会更好理解一点
public class SingleLinkedList {
/**链表的头结点*/
Node head = null;
/**
* 链表添加结点:
* 找到链表的末尾结点,把新添加的数据作为末尾结点的后续结点
* @param data
*/
public void addNode(int data){
Node newNode = new Node(data);
if(head == null){
head = newNode;
return;
}
Node temp = head;
while(temp.next != null){
temp = temp.next;
}
temp.next = newNode;
}
/**
* 反转链表,在反转指针前一定要保存下个结点的指针
*/
public void reserveLink(){
//这两个curNode和preNode可以理解成两个指针
Node curNode = head;//头结点 可以理解成原本的一个单链表 old
Node preNode = null;//前一个结点 //理解成一个新的单链表 new
while(curNode != null){
/**
* 利用头插法,将当前节点插入到新的单链表new的头部
* 再将当前节点的next指向old链表的头部
*/
Node nextNode = curNode.next;//保留下一个结点
/**
* 这两步代码的作用就是,对preNode进行头插法
* 将当前old链表的head节点头插法插入new链表的头部前面
* curNode.next = preNode;
* preNode = curNode;
* 等于
* newNode.next = head;
* head = newNode;
*/
curNode.next = preNode;
preNode = curNode;//
//最终,当前old链表的head已经被插入到new链表的最前面了,old链表最前面就得改成nextNode了
curNode = nextNode;//当前结点后移
}
head = preNode;
}
public class Node {
Node next = null;//下一个结点
int data;//结点数据
public Node(int data){
this.data = data;
}
}
}