Python3-[24]面试题24.翻转链表(链表)A

本文深入探讨了链表反转的两种常见算法:一是利用辅助栈和新链表的方法,通过栈保存原链表值,再构建新链表;二是采用双指针技巧,通过临时变量在原地反转链表,无需额外空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

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

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

P.S.题目来源于leetcode

解题思路

1.借助辅助栈+新链表

先用栈保存原链表的值。
新链表的值取自栈中。

code1:辅助栈
### 辅助栈+新链表
# 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 not head or not head.next: return head 
        #维护一个链表和栈
        stack = []
        newGuard = ListNode(None)#新的链表的哨兵节点
        curNew = newGuard
        cur = head#原始链表的当前节点
        stack.append(head.val)
        while cur.next:#填装栈
            cur = cur.next 
            stack.append(cur.val)
        while stack:#填装新链表
            curNew.next = ListNode(stack.pop())#更新当前节点的next
            curNew = curNew.next #更新当前节点
        return newGuard.next 

或者不用辅助栈,但需要新链表:

# 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 not head: return head
        pre = None
        cur = head
        cnt = 0
        while cur:
            cnt+=1
            tmp = ListNode(cur.val) 
            tmp.next = pre 
            pre = tmp 
            print(pre.val)
            cur = cur.next 
        print(cnt)
        return pre
2.双指针+辅助变量

引入一个辅助节点引用pre,tmp.
pre保存上一个节点,初始为None;
tmp作为当前节点的备份,用以进入下一节点。
再循环的过程中不断的修改cur.next。
修改完cur.next,更新pre和cur。
最后的pre即为结果。
核心:

while cur :#是cur(到最后一个节点)还是cur.next(倒数第二节点)取决于循环中是否有cur=cur.next(这只能到倒数第二节点)
    tmp = cur.next#保存cur.next,用于进入下一节点
    cur.next = pre
    pre = cur #更新pre和cur
    cur = tmp 
code2
####双指针
# 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 not (head and head.next):return head 
        pre = None#保存上一个值
        cur = head
        while cur :#是cur(到最后一个节点)还是cur.next(倒数第二节点)取决于循环中是否有cur=cur.next(这只能到倒数第二节点)
            tmp = cur.next
            cur.next = pre
            pre = cur #更新pre和cur
            cur = tmp 
        return pre   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值