三个链表的简单小问题:删除给定结点,删除倒数第N个结点,反转链表

1.删除给定节点,题目面试题 02.03. 删除中间节点 - 力扣(LeetCode)

解题思路。要删除给定的某个结点a,可以使他自身变为下一个结点b,然后在让a指向b的下一个结点c。在结果上来看,a就好像被删除了一样。“我杀不了我自己,那我就成为你,再杀了你。”

python3代码

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

class Solution:
    def deleteNode(self, node):        
        node.val=node.next.val
        node.next=node.next.next

2.删除链表的第N个结点,题目19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

解题思路。我们可以先定义两个快慢指针,让快指针先走,使他们的距离为N。然后让这两个指针以同样的速度一起行走,直到快指针走到末尾。此时删除慢指针的下一个结点即可。在删除结点时我们要考虑到删除头节点的情况,为了将头节点和其他结点以相同情况讨论,我们可以添加一个虚拟头节点dummy。代码如下

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        dummy=ListNode(0)
        dummy.next=head
        fast,slow=dummy,dummy
        #fast先走n步
        while(n):
            fast=fast.next
            n-=1
        #fast,next一起走,fast走到末尾停止
        while(fast.next):
            fast=fast.next
            slow=slow.next
        #删除slow.next结点
        slow.next=slow.next.next
        return dummy.next

3.反转链表,题目LCR 024. 反转链表 - 力扣(LeetCode)

3.1头插法实现反转链表

解题思路,先创建一个新的链表结点。然后将旧链表的结点依次插入到新链表的头部。代码如下

# 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:
        node=None
        while(head):
            tnode=head.next
            head.next=node
            node=head
            head=tnode
        return node

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值