算法通关村第二关——终于学会链表反转了
题目:LeetCode206,链表反转
思路:链表反转有两种思路
-
创建一个虚拟头结点,并在虚拟头结点直接逐个插入链表节点
-
直接在链表上操作,用双指针,分别操作。
-
(额外)利用递归进行链表反转
解法:
-
头插法
/** * 链表反转有两种方法 * 1.创造虚拟节点,然后把节点一个一个从中间插入 * 2.不创建虚拟节点,直接操作链表实现反转 * @param head * @return */ public ListNode reverseList(ListNode head) { //1.用虚拟节点实现反转 ListNode ansHead = new ListNode(-1); ListNode cur = head; while (cur!=null){ ListNode nextNode = cur.next; cur.next = ansHead.next; ansHead.next = cur; cur = nextNode; } return ansHead.next; }
-
穿针引线法
/** * 方法2,不创建虚拟节点,直接操作链表实现反转 * @param head * @return */ public ListNode reverseList2(ListNode head) { //1.直接操作链表 ListNode cur = head; ListNode prev = null; while (cur!=null){ ListNode next = cur.next; cur.next = prev; prev = cur; cur = next; } return prev; }
-
递归
class Solution { public ListNode reverseList(ListNode head) { if (head == null || head.next == null) { return head; } ListNode newHead = reverseList(head.next); head.next.next = head; head.next = null; return newHead; } }