文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。
相关文章:
- LeetCode:55. Jump Game(跳远比赛)
- Leetcode:300. Longest Increasing Subsequence(最大增长序列)
- LeetCode:560. Subarray Sum Equals K(找出数组中连续子串和等于k)
文章目录:
题目描述:
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
java实现方法1:
/**
* 将链表进行反转
*
* @param head 头结点
* @return 反转节点
*/
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode node = reverseList(head.next);
head.next.next = head;
head.next = null;
return node;
}
时间复杂度:O(n)
空间复杂度:O(1)
Python实现方法1:
def reverse_list(self, head: ListNode) -> ListNode:
'''
反转链表(递归方式)
Args:
head: 头结点位置
Returns:
头节点
'''
if not head or not head.next:
return head
pre = self.reverse_list(head.next)
head.next.next = head
head.next = None
return pre
时间复杂度:O(n)
空间复杂度:O(1)
java实现方法2:
/**
* 链表返回 非递归方式
*
* @param head 头节点
* @return 节点
*/
public ListNode reverseList2(ListNode head) {
ListNode pre = null;
ListNode cur = head;
ListNode tmp = null;
while (cur != null) {
// 记录当前节点的下一个节点
tmp = cur.next;
// 始终保持cur是pre的后驱节点,然后将当前节点指向pre
cur.next = pre;
pre = cur;
// cur节点前进一位
cur = tmp;
}
return pre;
}
时间复杂度:O(n)
空间复杂度:O(n)
Python实现方式2:
def reverse_list3(self, head: ListNode) -> ListNode:
'''
反转链表(非递归方式)
Args:
head: 头结点位置
Returns:
头节点
'''
cur, pre, temp = head, None, None
while cur:
cur.next, pre, cur = pre, cur, cur.next
return pre
时间复杂度:O(n)
空间复杂度:O(n)