原题链接:https://leetcode.cn/problems/reverse-linked-list
本题有两种解法。
双指针
其本质就是将当前节点的下一个节点由之前的next改为pre,这样就能完成当前节点的反转, 如此一直往后遍历链表, 并不断重复这个过程。由于在反转的过程中会造成链表的断开, 所以需要一个临时变量来保存。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| public ListNode reverseList(ListNode head) { ListNode pre = null; ListNode cur = head; while (cur != null){ ListNode tmp = cur.next; cur.next = pre;
pre = cur; cur = tmp; } return pre; }
|
递归
其思路和双指针类似, 只不过继续进行遍历的方式不同, 双指针使用的是移动指针,递归使用的是自身函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public ListNode reverseList1(ListNode head) { return reverse(null, head); }
public ListNode reverse(ListNode pre, ListNode cur){ if (cur == null){ return pre; } ListNode tmp = cur.next; cur.next = pre;
return reverse(cur, tmp); }
|