牛客:反转链表
- 题目描述
- 方法一:代码
- 解题思路
- 方法二:代码
- 解题思路
题目描述
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
数据范围:
0≤n≤1000
要求:空间复杂度 O(1) ,时间复杂度 O(n) 。
方法一:代码
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param head ListNode类
# @return ListNode类
#
class Solution:
def ReverseList(self , head: ListNode) -> ListNode:
new_head = None # 新的头节点
while head != None:
pro_head = head.next # 记录当前节点的下一个节点的位置
head.next = new_head # 更新当前节点的指向
new_head = head # 更新当前节点的位置
head = pro_head # 当前节点后移
return new_head
解题思路
把原链表的结点一个个摘掉,每次摘掉的链表都让他成为新的链表的头结点,然后更新新链表。
1->2->3->4
2->3->4 1
3->4 2->1
4 3->2->1
4->3->2->1
方法二:代码
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param head ListNode类
# @return ListNode类
#
import collections
class Solution:
def ReverseList(self , head: ListNode) -> ListNode:
if head == None:
return None
q = collections.deque()
while head != None:
q.append(head)
head = head.next
new_head = q.pop()
result_head = new_head
while len(q)!=0:
current_head = q.pop()
new_head.next = current_head
new_head = new_head.next
new_head.next = None
return result_head
解题思路
把链表节点一个个入栈,当全部入栈完之后再一个个出栈,出栈的时候在把出栈的结点串成一个新的链表