前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >234. 回文链表

234. 回文链表

原创
作者头像
Michel_Rolle
修改2021-03-01 14:50:16
5630
修改2021-03-01 14:50:16
举报
文章被收录于专栏:LeetCode解题LeetCode解题

234. 回文链表

链接

请判断一个链表是否为回文链表。

示例1

代码语言:txt
复制
输入: 1->2
输出: false

``

示例2

```shell

输入: 1->2->2->1

输出: true

解题思路

代码语言:txt
复制
type ListNode struct {
	Val  int
	Next *ListNode
}

// 思路:先使用快慢指针定位链表中点,然后反转中点的后半部分,最后分别从开头和中点处遍历比较是否是回文链表
func isPalindrome(head *ListNode) bool { // 使用快慢指针寻找链表中点,然后反转后半部分,再分别从开头和中点处遍历比较
	if head == nil {
		return true
	}
	// 1. 快慢指针寻找链表中点
	slow, fast := head, head
	for fast != nil && fast.Next != nil {
		fast = fast.Next.Next // 快指针一次走两步
		slow = slow.Next      // 慢指针一次走一步
	}
	// 2. 从中点开始反转链表后半部分
	var pre, cur *ListNode = nil, slow
	for cur != nil {
		next := cur.Next // 先记录下下一个节点,不然一会就没了
		cur.Next = pre   // 当前节点指向上一个节点
		pre = cur        // 指针后移
		cur = next
	}
	// 3. 分别从开头和中点处遍历比较
	mid := pre
	for mid != nil {
		if head.Val != mid.Val { // 比较每一个元素
			return false
		}
		mid = mid.Next // 指针后移
		head = head.Next
	}
	return true
}


// 解题2,取出链表中的数

func isPalindrome2(head *ListNode) bool {
	// 获取 list 中的值
	nums := make([]int, 0, 64)
	for head != nil {
		nums = append(nums, head.Val)
		head = head.Next
	}

	// 按照规则对比值
	l, r := 0, len(nums)-1
	for l < r {
		if nums[l] != nums[r] {
			return false
		}
		l++
		r--
	}
	return true
}

// 题解3
func isPalindrome3(head *ListNode) bool {
  if head == nil {
    return true
  }
  var res []*ListNode
  for head != nil {
    res = append(res, head)
    head = head.Next
  }
  left := 0
  right := len(res) - 1
  for left < right {
    if res[left].Val != res[right].Val {
      return false
    }
    left++
    right--
  }
  return true
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 234. 回文链表
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档