Python 判断链表是否为回文链表

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表

如果是,返回 true ;否则,返回 false 。

示例 1:

输入:head = [1,2,2,1]
输出:true

示例 2:

输入:head = [1,2]
输出:false

算法逻辑

回文链表的特点为从表头开始向表尾遍历所得到的元素是相同与从表尾开始向表头遍历所得到的元素,举个简单的例子来讲:

arr = [1,2,3,2,1]为一个数组,此数组中arr[0] == arr[4]即第一个元素与第len(arr)个元素是相同的,随后继续看arr[1]与arr[3]发现arr[1] == arr[3]那么这个数组就可以理解为“回文数组”

上述以数组举的例子是为了方便大家理解,当然这也是回文链表的特点,若要证明一个链表为回文链表,我们只需分别从表头表尾开始遍历链表直至链表的中心元素即可。

此方法时间复杂度为O(n)。

代码实现

第一步

我们先自定义一个链表,使其具有插入,输出全部元素,返回链表长度以及返回链表中的元素等功能

insert():链表中加入元素

    def insert(self,data):
        new_node = Node(data)
        if self.head == None:
            self.head = new_node
        else:
            current = self.head
            while current.next:
                current = current.next
            current.next = new_node

display():输出链表中的元素

    def display(self):
        if self.head == None:
            return
        else:
            current = self.head
            while current.next:
                print(current.data,end = "->")
                current = current.next
            print(current.data)

len():返回链表长度

    def len(self):
        count = 0
        if self.head == None:
            return count
        else:
            current = self.head
            while current.next:
                count = count + 1
                current = current.next
            return count + 1

output():返回指定位置中元素的值

    def output(self,num):
        if self.head == None:
            return
        else:
            count = 0
            current = self.head
            while count < num:
                current = current.next
                count += 1
            return current.data

 第二步

同时从表头表尾开始遍历链表,若存在头指针和尾指针指向的元素不相同的情况是返回False,否则返回True

def check(input_list):
    for i in range(input_list.len() // 2):
        if input_list.output(i) != input_list.output(input_list.len() - i - 1):
            return False
            break
    return True

完整代码

class Node:
    def __init__(self,data):
        self.data = data
        self.next = None
class linked_list:
    def __init__(self):
        self.head = None
    def insert(self,data):
        new_node = Node(data)
        if self.head == None:
            self.head = new_node
        else:
            current = self.head
            while current.next:
                current = current.next
            current.next = new_node
    def display(self):
        if self.head == None:
            return
        else:
            current = self.head
            while current.next:
                print(current.data,end = "->")
                current = current.next
            print(current.data)
    def len(self):
        count = 0
        if self.head == None:
            return count
        else:
            current = self.head
            while current.next:
                count = count + 1
                current = current.next
            return count + 1
    def output(self,num):
        if self.head == None:
            return
        else:
            count = 0
            current = self.head
            while count < num:
                current = current.next
                count += 1
            return current.data


def check(input_list):
    for i in range(input_list.len() // 2):
        if input_list.output(i) != input_list.output(input_list.len() - i - 1):
            return False
            break
    return True

list = linked_list()
list.insert(1)
list.insert(2)
list.insert(2)
list.insert(1)
list.insert(1)
list.display()
print(check(list))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值