Day1 反转链表【链表】【存疑】

题目:
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

思路:
先将原链表的value按顺序存入数组l中,再用数组的pop()方法,新建ListNode节点(数组中的value作为x输入),达到反转效果。
需注意:进行反转前,要先标记头节点,直接反转会找不到头节点。

代码:

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if head is None:
            return None
        p=head
        l=[]
        while p:
            l.append(p.val)
            p=p.next
        newhead=node=ListNode(l.pop())
        while l:
            node.next=ListNode(l.pop())
            node=node.next
        return newhead

企图优化:
数组中可以直接存ListNode节点
(原代码做法:数组中存放.val,再依据val新建ListNode节点)
原代码运行效果
Day1 反转链表【链表】【存疑】_第1张图片

可以看到优化后,虽然消耗内存变少,但耗时增加不少(优化了个寂寞)。下面是企图优化的代码
注意一定要加倒数第二行的 【node.next=None】不然会超出时间限制。原来的代码不用加这句是因为,新建ListNode节点 初始化时,默认self.next=None。而原节点的node.next是有值的,必须用None再覆盖掉原值,不然会打架

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if head is None:
            return None
        p=head
        l=[]
        while p:
            l.append(p)
            p=p.next
        newhead=node=l.pop()
        while l:
            node.next=l.pop()
            node=node.next
        node.next=None
        return newhead

错误代码:
只输出头节点的值,而非整个链表。为啥?

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        p=head
        l=[]
        while p:
            l.append(p.val)
            p=p.next
        n=len(l)
        while l:
            if len(l)==n:
                newhead=node=ListNode(l.pop())
            else:
                node=ListNode(l.pop())
            node=node.next
        return newhead

你可能感兴趣的:(剑指offer)