反转链表
将单链表的链接顺序反转过来
例如:1->2->3->4->5->6->7->8->9->10
10->9->8->7->6->5->4->3->2->1
链表是以node的形式存放的
要反转,那么第一个节点的next则指向null,如:
下一个节点的next要指向第一个节点的值。如:
解法:迭代,重复某一过程,每次处理结果作为下一次处理的初始值,这些初始值类似于状态、每次处理都会改变状态、直到到达最终状态。
从前往后遍历链表,将当前节点的next指向上一个节点,因此需要一个变量存储上一个节点prev,当前节点处理完需要寻找下一个节点、因此需要一个变量保持当前节点curr,处理完后要将当前节点赋值给prev,并将next指针赋值给curr,因此需要一个变量提前保存下一个节点的指针next
逻辑步骤:
- 将下一个节点指针保存到next变量 next = curr.next
- 将下一个节点的指针指向prev,curr.next = prev
- 准备处理下一个节点,将curr赋值给prev
- 将下一个节点赋值为curr,处理一个节点
实现代码案例
package com.hx;
public class ReverseList {
static class ListNode{
int val;
ListNode next;
public ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
public static ListNode iterate(ListNode head) {
ListNode prev = null, next;
ListNode curr = head;
while (curr != null) {
next = curr.next;
curr.next = prev;
prev= curr;
curr = next;
}
return prev;
}
}
测试验证代码
package com.hx;
public class Test {
public static void main(String[] args) {
ReverseList.ListNode node10 = new ReverseList.ListNode(10,null);
ReverseList.ListNode node9 = new ReverseList.ListNode(9,node10);
ReverseList.ListNode node8 = new ReverseList.ListNode(8,node9);
ReverseList.ListNode node7 = new ReverseList.ListNode(7,node8);
ReverseList.ListNode node6 = new ReverseList.ListNode(6,node7);
ReverseList.ListNode node5 = new ReverseList.ListNode(5,node6);
ReverseList.ListNode node4 = new ReverseList.ListNode(4,node5);
ReverseList.ListNode node3 = new ReverseList.ListNode(3,node4);
ReverseList.ListNode node2 = new ReverseList.ListNode(2,node3);
ReverseList.ListNode node1 = new ReverseList.ListNode(1,node2);
ReverseList.ListNode iterate = ReverseList.iterate(node1);
System.out.println(iterate);
}
}