📄 题目描述:
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
🤔 思路:
思路一:
思路参考 吴师兄的图解剑指 Offer 结构化专栏
使用三个指针,分别为 pre、cur、next,其中 pre 初始为 null,也是最终返回的链表头节点,cur 指向当前链表的头节点,next 为 cur 节点的下一个节点,遍历 cur 指针直至为 null,将 cur 的下一指针进行反转指向 pre ,然后将三个指针依次向后移动,最终返回 pre。
☕ 代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 public ListNode reverseList (ListNode head) { if (head == null ) { return null ; } ListNode pre = null ; ListNode cur = head; if (cur.next == null ) { return cur; } ListNode next = cur.next; while (next != null ) { cur.next = pre; pre = cur; cur = next; next = next.next; } cur.next = pre; pre = cur; return pre; }
☕ 代码写法二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public ListNode reverseList (ListNode head) { if (head == null ) { return null ; } ListNode pre = null ; ListNode cur = head; if (cur.next == null ) { return cur; } while (cur != null ) { ListNode next = cur.next; cur.next = pre; pre = cur; cur = next; } return pre; }
☕ 代码写法三:
1 2 3 4 5 6 7 8 9 10 public ListNode reverseList (ListNode head) { ListNode q = null ; while (head!=null ){ ListNode p = head; head = head.next; p.next = q; q=p; } return q; }
LeetCode 上有关于递归的解法,需要继续学习
🤔 思路二:
思路参考 LeetCode 题解
通过递归,每次返回反转的链表头节点,反转步骤为
pre.next.next = pre;
pre.next = null;
☕ 代码:
1 2 3 4 5 6 7 8 9 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; }