public class A {
public static void main(String[] args) {
ListNode root = new ListNode(1);
ListNode node1 = new ListNode(2);
ListNode node2 = new ListNode(3);
ListNode node3 = new ListNode(4);
ListNode node4 = new ListNode(5);
ListNode node5 = new ListNode(6);
root.next = node1;
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
ListNode listNode0 = reverse1(root);
print(listNode0);
ListNode listNode = reverse2(root);
print(listNode);
}
/**
* -1->1->2->3
* 思想是总是选取当前元素放到dummy的后面
*
* @param head
* @return
*/
private static ListNode reverse2(ListNode head) {
ListNode dummy = new ListNode(-1);
dummy.next = head;
//pre一直都是dummy的next的节点,但是位置一直在变化
ListNode pre = dummy.next;
ListNode cur = pre.next;
while (cur != null) {
//先把当前元素抽取走
pre.next = cur.next;
//再把当前元素的下一个指针指定dummy的后面
cur.next = dummy.next;
//dummy的后面再执行这个新元素
dummy.next = cur;
//pre一直没变化,他的下一个就是之前的cur.next
cur = pre.next;
}
return dummy.next;
}
/**
* 递归解法,一直递归到最后一个开始翻转这个链表
*
* @param pre
* @return
*/
private static ListNode reverse1(ListNode pre) {
if (pre == null || pre.next == null) {
return pre;
}
ListNode listNode = reverse1(pre.next);
ListNode current = pre.next;
current.next = pre;
//断链
pre.next = null;
return listNode;
}
private static void printReverse(ListNode root) {
if (root == null) {
return;
}
printReverse(root.next);
System.out.println(root.val);
}
private static void print(ListNode root) {
for (ListNode node = root; node != null; node = node.next) {
System.out.println(node.val);
}
}
}
class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
}
}
20.解闷算法-单链表的翻转
最新推荐文章于 2023-08-18 08:58:37 发布