链表的反转并输出每个节点:
方法一:递归法
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode next = head.next;
ListNode newHead = reverseList(next);
next.next = head;
head.next = null;
return newHead;
}
方法二:头插法
public ListNode reverseList(ListNode head) {
ListNode newHead = new ListNode(-1);
while (head != null) {
ListNode next = head.next;
head.next = newHead.next;
newHead.next = head;
head = next;
}
return newHead.next;
}
下面针对头插法进行一定的讲解:
1)链表的初始状态
2)ListNode next = head.next,这么做是防止head与head.next断开后失去连接,所以将head.next保存在next
3)head.next = newhead.next;
第一次循环的情况newhead的next是null,此处是将head的指针指向空,
此后的循环则是头插法建表的基本思想(结合第二和第三步看)
头插法建表的方法:
L1.next = newhead.next; newhead.next = L1;
3)newhead.next = head;
4)head = next; 此步骤是为了后续的遍历循环
至此全部的头插法建表的方法已经全都完成。
3.使用栈的方式反转链表(此方法比较简单,在此忽略)。