代码随想录算法训练营Day 4 | 24 交换链表元素,19 移除链表制定项指针

24 swap nodes in pairs

思路:将链表内的元素两个一组分配,然后交换彼此的node。

定义两个指针,prev和curr,用来标识当前要交换的节点对。交换之前,prev指向节点对外的前一个节点,curr指向节点对内的第一个节点。即如果链表为1->2->3->4,第一对进行交换的是1和2,prev为链表前的一位dummy,curr为1

交换过程:

1)将prev.next指向curr.next、

2)将curr.next指向curr.next.next

3)最后,将curr.next.next和curr交换

最后更新prev和curr,以进行交换下一对

代码:

# Definition for singly-linked list.
class ListNode(object):
     def __init__(self, val=0, next=None):
         self.val = val
         self.next = next
class Solution(object):
    def swapPairs(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        dummy = ListNode(0)
        dummy.next = head
        prev = dummy
        curr = head

        if not head or not head.next:
            return head
        while curr and curr.next:
            prev.next = curr.next
            curr.next = curr.next.next
            curr.next.next = curr
            prev = curr
            curr = curr.next
        return dummy.next

额然后超时了。。。时间复杂度为O(n),对比较长的链表来说,会很复杂。所以递归一下:

class Solution(object):
    def swapPairs(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        # 递归终止条件:如果链表为空或只剩一个节点,则无需交换,直接返回head
        if not head or not head.next:
            return head
        
        # 交换当前节点和下一个节点
        next_node = head.next
        head.next = self.swapPairs(next_node.next)
        next_node.next = head
        
        # 返回交换后的头节点
        return next_node

19 Remove Nth Node From End of List

思路:使用两个指针prev和curr,以及虚拟头dummy。执行删除指针即为本身的指针从指向下一位变成指向下下一位。

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

class Solution:
    def removeNthFromEnd(self, head, n):
        dummy = ListNode(0)
        dummy.next = head
        prev = dummy
        curr = head

        length = 0
        while curr:
            length += 1
            curr = curr.next

        target_pos = length - n

        for _ in range(target_pos):
            prev = prev.next

        prev.next = prev.next.next

        return dummy.next

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值