目标:
反转前
1 -->2–>3–>4
反转后
4–>3–>2–>1
思维
思维关键点
1 关键点一,本质
两两相邻的节点,的指向变反了而已。
清晰的抓本质,箭头方向的改变,这样才能写出简单代码!
2 关键点二 指针工具
做算法,指针工具的巧妙借用,本题至少pre current next 三个变量的指针用的上,试想反转一个指针,一定是存在两个节点,才能有个指向链吧!
current pre: 假设已知当前节点(current),那么就要考虑,指向当前节点的前一个节点pre。
next: 当current 的指针方向反转了,那么就访问不到从前旧的 next 指针了,所以需要提前在 指针反转前 取出,下一个循环要反转的节点
代码
public class ReverSingleLink {
public static void main(String[] args) {
ListNode listNode4 = new ListNode(4);
ListNode listNode3 = new ListNode(3, listNode4);
ListNode listNode2 = new ListNode(2, listNode3);
ListNode listNode1 = new ListNode(1, listNode2);
ListNode head = listNode1;
System.out.println("反转前");
pLink(head);
//反正方法
head = reverLink(head);
System.out.println("反转后");
pLink(head);
}
private static ListNode reverLink(ListNode head) {
ListNode pre = null;//虚拟一个节点,在每次反转的wile循环中,下一个元素要将指针指向前一个元素
ListNode current = head;
ListNode next;
while (current != null) {
//保存下一次需要遍历的 元素
next = current.next;
//闭眼体会 = 他是一个方向的箭头,箭头的方向从左向右指向 " ---> ",此时不同于我平时理解的右边赋值给左边!!
//本质修改了指针的方向!!!
current.next = pre;
//做好偏移量为下一圈循环做准备
pre = current;
current = next;
}
return pre;
}
private static void pLink(ListNode head) {
while (head != null) {
System.out.println(head.val);
head = head.next;
}
}
static class ListNode {
public int val;
public ListNode next;
public ListNode() {
}
public ListNode(int val) {
this.val = val;
}
public ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
}