前两天看到一个面试题:单向链表翻转,自己是个算法菜鸡,所以记录一下笔记和思路
定义单向链表数据结构:
/**
* 定义一个单链表
*/
public class Node {
private int data; //当前节点数据
private Node next; //下一个节点
public Node (int data) {
this.data = data;
}
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;
}
}
这里使用一个临时节点来进行翻转
public static Node Reverse2 (Node head){
//head为当前节点
Node preNode = null; //preNode为前一个节点
Node tempNode = null; //临时节点
//1、当前节点不为空则进行翻转
while(head!=null){
//2、把当前节点head的下一节点数据保存到临时节点中tempNode中,防止丢失
tempNode = head.getNext();
//3、把当前节点head的下一节点设置为前一个节点
head.setNext(preNode);
//4、把当前节点head赋值给前一节点
preNode = head;
//5、把临时节点的数据放到当前节点中
head = tempNode;
}
}
原理就是使用使用一个临时节点保存下一节点的数据,待当前节点指向前一节点之后再把临时节点的数据赋值给当前节点
分析一下这注释中5个步骤的数据变化: 单向链表 1—>2—>3—>4—>5
第一次循环:
注释1,会判断head是否为空,如果不为空进入循环,显然head为1—>2—>3—>4—>5
注释2,会把head.getNext()存入临时节点tempNode中(临时变量).这时候tempNode = head.getNext() = 2—>3—>4—>5
注释3,会把当前节点的next指向前一个节点 head.setNext(preNode).这时候preNode为初始值null。所以当前head为1—>null
注释4,会把当前节点赋值给前一节点preNode=head,这时候preNode的值为:1—>null
注释5,会把临时节点数据赋值给当前节点,这是head = tempNode = 2—>3—>4—>5. 第一次循环结束
第二次循环:
注释1,判断head是否为空,经过第一次循环结束之后head数据变为 2—>3—>4—>5。不为空,继续进入循环
注释2,把head.getNext()存入临时及诶单tempNode中,这时候tempNode = head.getNdext() = 3—>4—>5
注释3,把当前节点的next指向前一个节点,第一次循环之后preNode值为1—>null,所以head为2—>1—>null
注释4,把当前节点赋值给前一节点,这时候preNode的值为:2—>1—>null
注释5,把临时变量的值赋值给当前节点,这时候head的值就会变为3—>4—>5。第二次循环结束
第三次循。。。第四次循环。。直到循环结束之后preNode就会变为5—>4—>3—>3—>1