单链表逆转主要有两种方式:递归、遍历,出于效率和数据量(递归栈深度相对有限)的考虑,采用遍历方式,以Java实现。
定义链表结构
public class ListNode {
ListNode next;
Integer data;
public ListNode(Integer data) {
this.data = data;
}
}
初始化链表
public ListNode init() {
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
ListNode node4 = new ListNode(4);
ListNode node5 = new ListNode(5);
ListNode node6 = new ListNode(6);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = node6;
return node1;
}
算法部分
public ListNode reverse(ListNode listNode) {
// 当前节点
ListNode cur = listNode;
// 前驱节点
ListNode pre = null;
// 后驱节点
ListNode next;
while (cur != null) {
// 先保存后驱节点
next = cur.next;
// 将前后逆转
cur.next = pre;
// 前后驱节点向后移动
pre = cur;
cur = next;
}
// 前驱节点移动到最后,完成链表的逆序
return pre;
}
测试
public static void main(String[] args) {
Test test = new Test();
ListNode listNode = test.init();
ListNode listReverse = listNode;
while(listNode != null){
System.out.println(listNode.data);
listNode = listNode.next;
}
System.out.println("===============================");
listReverse = test.reverse(listReverse);
while(listReverse != null){
System.out.println(listReverse.data);
listReverse = listReverse.next;
}
}
结果
