234. 回文链表

给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。

拿到这个题的第一念头,就是将链表数据copy到数组中,根据下标判断这个数组是否是回文,进而得到链表的结果。这个方法很简单,我专门看了下本地的挑战点,是说时间复杂度o(n),空间复杂度o(1),那这样怎么计算呢,不管我是重建数组还是重建链表,都需要空间。然后我就考虑申请两个变量,count计数变量、newHead空头指针,

1、遍历链表,获取链表长度count

2、遍历链表,访问到中间位置

3、开始翻转后半部分链表

4、比较两个链表,不等,直接返回false,最终返回true,上代码

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func isPalindrome(head *ListNode) bool {
	if head == nil{
		return false
	}
	p := head
	count := 0
	for p != nil{
		count++
		p = p.Next
	}
	p = head
	for i:=0;i< count/2;i++{
		p = p.Next
	}
	newHead := new(ListNode)
	for p != nil{
		t := p
		p = p.Next
		t.Next = newHead.Next
		newHead.Next = t
	}
	p = head
	q := newHead.Next

	for p != nil && q != nil{
		if p.Val != q.Val{
			return false
		}
		p = p.Next
		q = q.Next
	}
	return true
}

一次通过,但是效率仿佛没有那么高,我看了官方的解法,思路类似,但代码未细看

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值