LeetCode 206反转链表
300 Words|Read in about 2 Min|本文总阅读量次
leetcode第206题,反转链表。采用迭代的算法来完成。
LeetCode 206反转链表
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例 1:
1输入:head = [1,2,3,4,5]
2输出:[5,4,3,2,1]
示例 2:
1输入:head = [1,2]
2输出:[2,1]
示例 3:
1输入:head = []
2输出:[]
提示:
- 链表中节点的数目范围是
[0, 5000]
-5000 <= Node.val <= 5000
**进阶:**链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?
思路
遍历链表,用另外一个新链表来存储每一次的结点
- 链表开始遍历的时候,构造一个新链表,新链表指向
null
- 链表每移动一个结点,就把当前结点的指向修改成指向新链表中的结点
- 直到链表移动到
null
结束,那么新链表就为反转的链表
- 需要一个变量保存当前的遍历结点,用于判断是否到最后一个节点,
current = head;
current = current.next;
nextTmp
变量用于保存下一个结点,因为一旦将当前结点的指向修改,就找不到下一个结点。nextTmp = current.next;
preTmp
变量用于保存当前结点,因为下一个结点无法主动找到上一个结点,preTmp = current;
并且preTmp = current;
操作要在current = current.next;
解题
1/**
2 * Definition for singly-linked list.
3 * public class ListNode {
4 * int val;
5 * ListNode next;
6 * ListNode() {}
7 * ListNode(int val) { this.val = val; }
8 * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
9 * }
10 */
11class Solution {
12 //让当前指针的指向改成往前,需要用另外一个链表的保存
13 public ListNode reverseList(ListNode head) {
14 if(null == head) return null;
15 ListNode preNode = null;//保存每一个链表结点的值
16 ListNode cur = head;//链表的当前指向结点
17 while(null != cur)
18 {
19 ListNode next = cur.next;
20 cur.next = preNode;
21 preNode = cur;
22 cur = next;
23 }
24 return preNode;
25 }
26}
递归
也可以采用递归的方式
- 传入的是
head
链表头部。需要翻转链表,意味着第二个节点的next
指向1,head.next.next = head;
- 然后再将1结点的
next
指向null
,head.next = null;
,避免形成环形链表 - 上面是1结点和2结点的翻转,并且可以将这种方式推广到剩余的结点,也可以两两翻转
按照上面的操作,会发现按顺序执行会找不到第二个结点后面的结点,因为可以逆序操作,从最后一个结点,一个个倒退回到第一个结点
1/**
2 * Definition for singly-linked list.
3 * public class ListNode {
4 * int val;
5 * ListNode next;
6 * ListNode() {}
7 * ListNode(int val) { this.val = val; }
8 * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
9 * }
10 */
11class Solution {
12 //让当前指针的指向改成往前,需要用另外一个链表的保存
13 public ListNode reverseList(ListNode head) {
14 if(null == head || null == head.next) return head;
15
16 ListNode newlist = reverseList(head.next);
17 head.next.next = head;
18 head.next = null;
19 return newlist;
20 }
21}