一、leetcode算法
1、反转链表
1.1、题目
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
1.2、思路
思路一:此题我们使用迭代的方式将每一个节点进行变化,首先要定义好当前节点,前一个节点,下一个节点都是谁,然后将他们进行一个值的转换。
1.3、答案
/** * 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) { //定义前一个节点 ListNode prev = null; //定义当前节点 ListNode curr = head; //判断当前节点不为空 while(curr != null){ //保存下一个节点,防止当前节点指向前一个节点后,下一个节点找不到 ListNode next = curr.next; //将当前节点指向前一个节点 curr.next = prev; //将前一个节点定义为当前节点 prev = curr; //将当前节点定义为下一个节点 curr = next; } return prev; } }
复杂度分析
时间复杂度:O(n),其中 n 是链表的长度。需要遍历链表一次。
空间复杂度:O(1)。