刷题记:Python实现反转链表

● 示例:
○ 输入: 1->2->3->4->5->NULL
○ 输出: 5->4->3->2->1->NULL

● 思路:

○ 函数开头的两个if,用来判断当前节点和下一节点是否为null;
○ 进行递归,传递head.next,链表会一直往后传递,直到找到最后一个节点,不满足第二个if,返回节点5;
○ 上一步返回后,headNode等于返回的节点5,作为表头,反转第一步完成;
刷题记:Python实现反转链表_第1张图片
○ 再往回返回,当前节点为节点4,head.next指向节点5,head.next.next指向None。这时候 head.next.next=head 让原来指向None的节点5指向节点4,然后 head.next=None,用于截断节点4到节点5的指针;
刷题记:Python实现反转链表_第2张图片
○ 同理,返回上一层,当前节点head为节点3,让节点4指向节点3,再截断节点3到节点4的指针;
刷题记:Python实现反转链表_第3张图片
○ 如此重复,直到反转所有节点,headNode即为反转后的链表。

class ListNode():
    def __init__(self, x):
        self.val = x
        self.next = None

def reverseList(head: ListNode) -> ListNode:
    # 判断当前节点和下一个节点是否为Null
    if not head:
        return None
    if not head.next:
        return head

    headNode = reverseList(head.next)
    head.next.next = head
    head.next = None
    return headNode

def print_node(h):
    lst = [h.val]
    while (h.next != None):
        lst.append(h.next.val)
        h = h.next
    print(lst)

head = ListNode(1)
node1 = ListNode(2)
node2 = ListNode(3)
node3 = ListNode(4)
node4 = ListNode(5)

head.next = node1
node1.next = node2
node2.next = node3
node3.next = node4

h = head
print_node(h)

print_node(reverseList(h))

'''
[1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]
'''

你可能感兴趣的:(#,python,#,Leetcode,#,面试题,python,链表)