链表

2023-08-21  本文已影响0人  乔一波一

一、 链表的基本操作

解题思路:

注意插入删除位置的判断,然后是移位保持正确。

#定义链表节点
class LinkedNode:
    def __init__(self, val = 0, next = None):
        self.val = val
        self.next = next

#定义链表基本操作
class MyLinkedList:
    def __init__(self):
        self._size = 0
        self._dummyHead = LinkedNode(0)
    #获取到第index个节点数值,如果index是非法数值直接返回-1, 注意index是从0开始的,第0个节点就是头结点 
    def get(self, index):
        if index > (self._size - 1) or index < 0:
            return -1
        cur = self._dummyHead.next
        while index:
            cur = cur.next
            index -= 1
        return cur.val
    #在链表最前面插入一个节点,插入完成后,新插入的节点为链表的新的头结点
    def addAtHead(self, val):
        newNode = LinkedNode(val)
        newNode.next = self._dummyHead.next
        self._dummyHead.next = newNode
        self._size += 1
    #在链表最后面添加一个节点
    def addAtTail(self, val):
        newNode = LinkedNode(val)
        cur = self._dummyHead
        while cur.next:
            cur = cur.next
        cur.next = newNode
        self._size += 1
    #在第index个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点。
    def addAtIndex(self, index, val):
        if index > self._size:
            return -1
        if index < 0:
            return -1
        newNode = LinkedNode(val)
        cur = self._dummyHead
        while index:
            cur = cur.next
            index -= 1
        newNode.next = cur.next
        cur.next = newNode
        self._size += 1
        return 0
    #删除第index个节点,如果index 大于等于链表的长度,直接return,注意index是从0开始的
    def deleteAtIndex(self, index):
        if index >= self._size or index < 0:
            return -1
        cur = self._dummyHead
        while index:
            cur = cur.next
            index -= 1
        tmp = cur.next
        cur.next = cur.next.next
        del tmp
        self._size -= 1
        return 0
    #打印链表
    def printLinkedList(self):
        cur = self._dummyHead
        if cur.next == None:
            return -1
        while cur.next:
            print(cur.next.val, end = ' ')
            cur = cur.next
        print()
        return 0

if __name__ == "__main__":
    while True:
        mylinklist = MyLinkedList()
        try:
            # 读取链表长度和链表数值
            n, *nums = list(map(int, input().split()))
            # 初始化链表
            for i in range(n):
                mylinklist.addAtHead(nums[i])
            # 读取操作的个数
            m = int(input())
            for i in range(m):
                s = input().split()
                if s[0] == "show":
                    if mylinklist.printLinkedList() == -1:
                        print("Link list is empty")
                if s[0] == "delete":
                    t = int(s[1])
                    if mylinklist.deleteAtIndex(t - 1) == -1:
                        print("delete fail")
                    else:
                        print("delete OK")
                if s[0] == "insert":
                    t = int(s[1])
                    z = int(s[2])
                    if mylinklist.addAtIndex(t - 1, z) == -1:
                        print("insert fail")
                    else:
                        print("insert OK")
                if s[0] == "get":
                    t = int(s[1])
                    getValue = mylinklist.get(t - 1)
                    if getValue == -1:
                        print("get fail")
                    else:
                        print(getValue)
        except:
            break

二、单链表反转

解题思路

单链表反转其实就是将链表中当前元素的指针指向前一个元素;中间需要使用temp保存当前元素以保证能够访问链表中下一个元素,以此迭代下去。

class LinkNode:
    def __init__(self, val, next=None) -> None:
        self.val = val
        self.next = next


def printLinkList(node):
    while node.next:
        print(node.val, end=" ")
        node = node.next
    print(node.val)


def reverseLinkList(node):
    pre = None
    cur = node
    temp = None
    while cur:
        temp = cur.next
        cur.next = pre  # 翻转操作
        pre = cur  # 更新pre 和 cur指针
        cur = temp
    return pre

if __name__ == "__main__":
    while True:
        try:
            # 输入5 1 2 3 4 5,表示链表有5个节点,值分别为1 2 3 4 5
            n, *nums = map(int, input().split())
        except:
            break
        if n == 0:
            print("list is empty")
            continue
        dummyHead = LinkNode(0)  # 这里定义的头结点 是一个虚拟头结点,而不是真正的链表头结点
        cur = dummyHead
        for i in range(n):  # 开始构造节点
            cur.next = LinkNode(nums[i])
            cur = cur.next
        printLinkList(dummyHead.next)  # 打印链表
        printLinkList(reverseLinkList(dummyHead.next))  # 打印翻转后的链表

三、删除链表中的重复元素

解题思路

链表中连续两个节点的值相等,则前一个节点的指针指向下下个节点,再接着判断。

class LinkNode:
    def __init__(self, val, next=None) -> None:
        self.val = val
        self.next = next

def printLinkList(node): # 打印当前链表
    while node.next:
        print(node.val, end=" ")
        node = node.next
    print(node.val)

def removeSame(head):
    if not head:
        return None
    cur = head
    while cur and cur.next:
        if cur.val == cur.next.val: # 如果当前元素和下一个元素值相等
            cur.next = cur.next.next # 当前元素的指针跳过下一个元素,指向下下个。
        else:
            cur = cur.next
    return head

if __name__ == "__main__":
    while True:
        try:
            n, *nums = map(int, input().split())
        except:
            break
        if n == 0:
            print("list is empty")
            continue
        dummyHead = LinkNode(0)  # 这里定义的头结点 是一个虚拟头结点,而不是真正的链表头结点
        cur = dummyHead
        for i in range(n):  # 开始构造节点
            cur.next = LinkNode(nums[i])
            cur = cur.next
        printLinkList(dummyHead.next)  # 打印链表
        printLinkList(removeSame(dummyHead.next))  # 打印去重后的链表
上一篇 下一篇

猜你喜欢

热点阅读