链表反转是一个高频的面试题,其变种题的类型很多,但万变不离其宗,掌握基本的链表反转,是解决一切链表反转相关题目的基础,下面一起来看看吧。
使用辅助虚拟头节点进行链表反转
本质是利用头插法来进行链表反转
public static ListNode reverseListByDummyNotCreate(ListNode head) {
//思路:构造一个虚拟头节点,然后遍历原链表,将遍历的节点依次插入在头节点后面
ListNode dummy = new ListNode(-1);
ListNode cur = head;
while (cur != null) {
ListNode next = cur.next;
cur.next = dummy.next;
dummy.next = cur;
cur = next;
}
return dummy.next;
}
不用头结点,基本的反转方法
public static ListNode reverseListSimple(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while (cur != null){
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
最后还可以使用递归来处理
public static ListNode reverseListByRecurse(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode newHead = reverseListByRecurse(head.next);
head.next.next = head;
head.next = null;
return newHead;
}
总结
三种方式都可以实现链表反转,其中第一种最好理解,第二种面试中考察的比较多,第三种了解即可。