codetop2:反转链表

反转链表

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

示例 1:

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

示例 2:

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

示例 3:

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

思路

定义三个节点,第一个节点和第二个节点负责连接链表,第三个链表负责连接前面两个链表和后一个链表。确定一个终止条件,这个终止条件我确定的不好。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if head is None:
            return None
        pre = None
        cur = head
        later = cur.next
        while cur:
            #指向
            cur.next=pre
            #更新
            pre=cur
            cur=later
            later=later.next if later is not None else later
        return pre

思路

使用递归的方式,交换两个链表依次递归下去

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        return self.reverse(head, None)
    def reverse(self, cur: ListNode, pre: ListNode) -> ListNode:
        if cur == None:
            return pre
        temp = cur.next
        cur.next = pre
        return self.reverse(temp, cur)

思路

使用栈存储节点

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head:
            return
        stack=[]
        while head:
            stack.append(head)
            head=head.next
        nullhead=ListNode()
        head=stack.pop()
        nullhead.next=head
        while stack:
            head.next=stack.pop()
            head=head.next
        head.next=None
        return nullhead.next

思路

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        dummp=None
        pre=dummp
        if not head:
            return None
        later=head.next
        while head:
            head.next=pre
            pre=head
            head=later
            later=later.next if later else None
        return pre

这个是最新写的,如果while遍历的时候选择later节点,会更好。

Share