链表的翻转(java)
翻转的两种方法:非递归与递归。
1、非递归方法
public ListNode reverse(ListNode node) {
Node prev = null;
while (node != null) {
//每次新建一个链表,用来读取每次循环操作的一个节点
ListNode tmp = node;
//将传入的链表指向下一个节点,下次循环将下一个节点重新赋给tmp
node = node.next;
//将取出的节点的下一个节点置为上次操作后已完成翻转的部分节点
tmp.next = prev;
//将新的完成翻转部分的节点重新赋给待输出的链表
prev = tmp;
}
//输出已完成翻转的链表
return prev;
}
2、递归方法
public Node reverse(ListNode node) {
ListNode prev = null;
//递归判断条件,当链表为空或只有一个节点时,跳出递归
if (node == null || node.next == null) {
prev = node;
} else {
//完成原链表完成从第二个节点到最后一个节点间的翻转
ListNode tmp = reverse(node.next);
//原链表第二个节点指向第一个节点
node.next.next = node;
//原链表第一个节点指向空,完成链表翻转
node.next = null;
prev = tmp;
}
return prev;
}
浙公网安备 33010602011771号