【面试必刷TOP101】判断一个链表是否为回文结构 & 链表的奇偶重排

目录

题目:判断一个链表是否为回文结构_牛客题霸_牛客网 (nowcoder.com)

题目的接口:

解题思路:

代码:

过啦!!!

题目:链表的奇偶重排_牛客题霸_牛客网 (nowcoder.com)

题目的接口:

解题思路:

代码:

过啦!!!

写在最后:


题目:判断一个链表是否为回文结构_牛客题霸_牛客网 (nowcoder.com)

题目的接口:

package main
import . "nc_tools"
/*
 * type ListNode struct{
 *   Val int
 *   Next *ListNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param head ListNode类 the head
 * @return bool布尔型
*/
func isPail( head *ListNode ) bool {
    // write code here
}

解题思路:

这道题我的思路还是比较清晰的,主要是三步走,首先是快慢指针找到了链表的中点,第二步是对后半部分的链表进行反转操作,以方便最后的比较,第三步就是比较,如果比较结果相同,就证明他是一个回文链表,

这里说两句我的思考,如果我是面试官有可能会出这道题目,他包含了快慢指针找中点的一个思想,包含了链表反转的方案,还包含了链表之间的比较

代码:

package main
import . "nc_tools"
/*
 * type ListNode struct{
 *   Val int
 *   Next *ListNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param head ListNode类 the head
 * @return bool布尔型
*/
func isPail( head *ListNode ) bool {
    if head == nil || head.Next == nil {
        return true
    }
 
    //1,找链表中点,双数就是后面的数
    fast, slow := head, head
    for fast != nil && fast.Next != nil {
        fast = fast.Next.Next
        slow = slow.Next
    }
 
    //2,翻转链表
    var pre *ListNode
    cur := slow
    for cur != nil {
        temp := cur.Next
        cur.Next = pre
        pre = cur
        cur = temp
    }
 
    //3,比较链表值大小
    mid := pre
    for mid != nil {
        if mid.Val != head.Val {
            return false
        }
        mid = mid.Next
        head = head.Next
    }
    return true
}

过啦!!!

题目:链表的奇偶重排_牛客题霸_牛客网 (nowcoder.com)

题目的接口:

package main
import . "nc_tools"
/*
 * type ListNode struct{
 *   Val int
 *   Next *ListNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param head ListNode类 
 * @return ListNode类
*/
func oddEvenList( head *ListNode ) *ListNode {

}

解题思路:

这道题的方法有很多,可以直接操作链表完成,但是这样思路比较难思考,所以我选择了一个比较简单的方法,就是直接创建两个链表,分离奇数和偶数的节点

最后将奇数链表和偶数链表接到一起就行:

代码:

package main
import . "nc_tools"
/*
 * type ListNode struct{
 *   Val int
 *   Next *ListNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param head ListNode类 
 * @return ListNode类
*/
func oddEvenList( head *ListNode ) *ListNode {
    head1 := &ListNode{}
    head2 := &ListNode{}

    cur := head
    pre := head2
    Rhead := head1
    num := 0
    for cur != nil {
        num++
        temp := &ListNode{Val: cur.Val}
        if num % 2 != 0 {
            head1.Next = temp
            head1 = temp
        } else {
            head2.Next = temp
            head2 = temp
        }
        cur = cur.Next
    }
    head1.Next = pre.Next
    return Rhead.Next
}


过啦!!!

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

猜你喜欢

转载自blog.csdn.net/Locky136/article/details/133073708