206. 反转链表


206.反转链表

一、题目

给你单链表的头节点head,请你反转链表,并返回反转后的链表。

示例一

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例二

输入:head = [1,2]
输出:[2,1]

示例三

输入:head = []
输出:[]

提示

  • 链表中节点的数目范围是[0, 5000]
  • -5000 <= Node.val <= 5000

二、相关链接

三、解题思路

  • 解法:链表
  • 思路:遍历链表,并同时将当前的结点反转
  • 步骤:以1->2->3->4->5为例
    • 1.定义tail作为反转后链表的最后一个结点
    • 2.遍历head直到null
      • a.局部变量next存放head的下一个结点head.next
      • b.head指向反转链表的头结点tail
      • c.重置tailhead
      • d.重置headnext(a步骤)
    • 3.输出tail

四、代码

java
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
  public ListNode reverseList(ListNode head) {
    //思路:拿到下一个结点后反转当前结点(最后指向tail)
    ListNode tail = null;

    //例子:1->2->3->4->5
    while(head!=null) {
      //获取head后面的结点(如1->2)
      ListNode next  = head.next;
      //重置head的next(反转,1->null)
      head.next = tail;
      //重置tail的位置(为上一句head)
      tail = head;
      //重置head为后面的结点(如1->2)
      head = next;
    }

    return tail;
  }
}

五、执行结果

执行结果通过
执行用时0 ms, 在所有Java提交中击败了100.00%的用户
内存消耗38.4 MB, 在所有Java提交中击败了20.41%的用户
通过测试用例28/28

六、总结

  • 难度:简单
  • 总结:典型的链表算法,相关next操作比较容易混,建议画图(一开始没画图导致有些许步骤混淆,有必要记录)

文章作者: GaryLee
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 GaryLee !