链表-基础训练(二) day14

发布于:2025-02-22 ⋅ 阅读:(16) ⋅ 点赞:(0)

两两交换链表中的节点

题目示意:

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

原先我的思路是图像上的思路,但是我感觉还是很复杂,

思路1:

原代码:
class ListNode:
    def __init__(self,data=0,next=None):
        self.value = data
        self.next = next
class MylinkList:
    def __init__(self):
        self.dummy_head = ListNode()
        self.size = 0

    def addAtHead(self,index:int)->None:
        self.dummy_head = ListNode(index,self.dummy_head.next)
        self.size += 1

    def printList(self)->None:
        current = self.dummy_head
        while current:
            print(current.value,end = "->" if current.next else "")
            current = current.next
        print()

    def swapList(self)->None:
        if self.size <= 1:
            print("元素太少不进行翻转")
            return
        else:
            current_1 = self.dummy_head.next
            current_2 = current_1.next
            current_3 = current_2.next

            self.dummy_head.next = current_2
            current_2.next = current_1
            current_1.next = current_3

            for i in range(1,self.size // 2):
                # 更新指针
                temp = current_1
                current_2 = current_3.next
                current_1 = current_3
                current_3 = current_2.next
                # 交换位置
                temp.next = current_2
                current_2.next = current_1
                current_1.next = current_3

# 开始调用函数
obj = MylinkList()
obj.addAthead(1)
obj.addAthead(10)
obj.addAthead(2)
obj.addAthead(3)
obj.addAthead(21)
obj.addAthead(4)
obj.addAthead(33)
obj.printList()
obj.swapList()
obj.printList()
报错:

AttributeError: 'NoneType' object has no attribute 'next'

这个报错主要是因为在current_3的时候很可能是空的,所以我们需要修改代码,同时还有一些其他的错误,主要是对代码的掌控能力还不够:

代码修正:
    def addAtHead(self,index:int)->None:
        self.dummy_head.next = ListNode(index,self.dummy_head.next)
        self.size += 1

不可以修改头节点

原代码修改后:
class ListNode:
    def __init__(self,data=0,next=None):
        self.value = data
        self.next = next
class MylinkList:
    def __init__(self):
        self.dummy_head = ListNode()
        self.size = 0

    def addAtHead(self,index:int)->None:
        self.dummy_head.next = ListNode(index,self.dummy_head.next)
        self.size += 1

    def printList(self)->None:
        current = self.dummy_head
        while current:
            print(current.value,end = "->" if current.next else "")
            current = current.next
        print()

    def swapList(self)->None:
        if self.size <= 1:
            print("元素太少不进行翻转")
            return

        # 使用虚拟头结点简化
        current_1 = self.dummy_head
        current_2 = current_1.next
        current_3 = current_2.next
        while current_1.next!=None and current_1.next.next!=None:
            current_2.next = current_3.next
            current_3.next = current_2
            current_1.next = current_3

            #交换
            current_1 = current_3
            current_2 = current_1.next if current_1 else None
            current_3 = current_2.next if current_2 else None

# 开始调用函数
obj = MylinkList()
obj.addAtHead(1)
obj.addAtHead(10)
obj.addAtHead(2)
obj.addAtHead(3)
obj.addAtHead(21)
obj.addAtHead(4)
obj.addAtHead(33)
obj.printList()
obj.swapList()
obj.printList()
思路2:
代码:
class ListNode:
    def __init__(self,data=0,next=None):
        self.value = data
        self.next = next

class MylinkList:
    def __init__(self):
        self.dummy_head = ListNode()
        self.size = 0

    def addAtHead(self,index:int)->None:
        self.dummy_head.next = ListNode(index,self.dummy_head.next)
        self.size += 1

    def printList(self)->None:
        current = self.dummy_head
        while current:
            print(current.value,end = "->" if current.next else "")
            current = current.next
        print()

    def swapList(self)->None:
        if self.size <= 1:
            print("元素太少不进行翻转")
            return

        current = self.dummy_head
        temp_1 = current.next
        temp_2 = temp_1.next
        while current.next and current.next.next:
            temp_1.next = temp_2.next
            temp_2.next = temp_1
            current.next = temp_2

            current = temp_2 if temp_2 else None
            temp_1 = current.next if current else None
            temp_2 = temp_1.next if temp_1 else None

# 开始调用
obj = MylinkList()
obj.addAtHead(1),obj.addAtHead(2),obj.addAtHead(3),obj.addAtHead(10)
obj.addAtHead(15),obj.addAtHead(16),obj.addAtHead(20)
obj.printList()
obj.addAtHead(35)
obj.printList()
obj.swapList()
obj.printList()

删除链表的倒数第N个节点

题目示意:

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

进阶思考:

你能尝试使用一趟扫描实现吗?

链表的题建议大家画图来思考:

针对删除的代码:

def deleteN(self,index:int)->None:
        if index>self.size:
            print("超出了链表的范围")
            return
        else:
            current = self.dummy_head
            for i in range(0,index-1):
                current = current.next
            print(current.next.value)
            current.next =current.next.next
            self.size -= 1

完整的代码:

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

class MylinkList:
    def __init__(self):
        self.dummy_head = ListNode()
        self.size = 0

    def addAtHead(self,index:int)->None:
        self.dummy_head.next = ListNode(index,self.dummy_head.next)
        self.size += 1

    def printList(self)->None:
        current = self.dummy_head.next
        while current:
            print(current.value,end = "->" if current.next else "")
            current = current.next
        print()

    def swapList(self)->None:
        if self.size <= 1:
            print("元素太少不进行翻转")
            return

        current = self.dummy_head
        temp_1 = current.next
        temp_2 = temp_1.next
        while current.next and current.next.next:
            temp_1.next = temp_2.next
            temp_2.next = temp_1
            current.next = temp_2

            current = temp_2 if temp_2 else None
            temp_1 = current.next if current else None
            temp_2 = temp_1.next if temp_1 else None

    def deleteN(self,index:int)->None:
        if index>self.size:
            print("超出了链表的范围")
            return
        else:
            current = self.dummy_head
            for i in range(0,index-1):
                current = current.next
            print(current.next.value)
            current.next =current.next.next
            self.size -= 1

# 开始调用
obj = MylinkList()
obj.addAtHead(1),obj.addAtHead(2),obj.addAtHead(3),obj.addAtHead(10)
obj.addAtHead(15),obj.addAtHead(16),obj.addAtHead(20)
obj.printList()
obj.addAtHead(35)
obj.printList()
obj.swapList()
obj.printList()
obj.deleteN(4)
obj.printList()

链表相交

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。

图示两个链表在节点 c1 开始相交:

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

示例 1:

此题暂时留作思考题,希望大家都思考思考


网站公告

今日签到

点亮在社区的每一天
去签到