美文网首页
面试:反转链表

面试:反转链表

作者: 若鱼治水 | 来源:发表于2020-03-22 21:58 被阅读0次

题目:反转链表

要求:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

限制:

0 <= 节点个数 <= 5000

反转链表算是面试中比较常见的一个关于链表的题,整体上难度不大,但如果你能掌握多种的解法,往往可以让面试官眼前一亮

注意提醒一点,在面对链表的面试题时,建议多画一下图理解一下

解法 1:简单双指针

image

通过双指针,遍历 head 指针,通过中间变量,逐步指向新的 head 节点,完成链表反转

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseList(head *ListNode) *ListNode {
    if head == nil {
        return nil
    }

    var newHead *ListNode
    for head != nil {
        node := head.Next
        head.Next = newHead
        newHead = head
        head = node
    }

    return newHead
}

结果如下:

image

还有一种简化的写法,在同一步操作中,改变各个变量对应的值,可以省去中间变量,但这样阅读其实并不友好

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseList(head *ListNode) *ListNode {
    if head == nil {
        return nil
    }

    var newHead *ListNode
    for head != nil {
        head, head.Next,newHead = head.Next, newHead, head
    }

    return newHead
}
image

解法 2:递归

整体思路是递归到最后一个节点,这个节点就是链表反转后的头节点,这里记作 ret,最终只需要返回这个 ret 指针即可,剩余的都是对中间数据进行指针反转。

具体要怎么分析呢?这样就要画个图了

image image
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseList(head *ListNode) *ListNode {
    if head == nil || head.Next == nil {
        return head
    }

    ret := reverseList(head.Next)
    head.Next.Next = head
    head.Next = nil
    return ret
}

递归去做其实不太容易理解,但也不失为一个巧妙的方法:

image

解法 3:双头指针

这个解法是参考 leetcode 大神的题解的,跟双指针的解法有点像,但更巧妙

image
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseList(head *ListNode) *ListNode {
    if head == nil {
        return nil
    }

    cur := head
    for head.Next != nil {
        t := head.Next.Next
        head.Next.Next = cur // 反转原指针方向
        cur = head.Next // 将新头节点移到下一位
        head.Next = t // 连接回断开的地方,继续重复上面操作
    }

    return cur
}

效果跟简单的双指针没差多少:

image

欢迎关注公众号:若鱼治水,文章会首发在公众号,也可备注加我备注进群进技术交流群~

相关文章

  • 反转链表

    《剑指offer》面试题24:输入一个链表,反转链表后,输出新链表的表头。 思路:反转链表就是将链表中每一个节点的...

  • 单链表的就地逆置--java实现(含头节点和不包含头节点)

    前沿:链表是面试中经常问道的知识点,比如链表反转,就地反转,判断单链表是否相交,判断链表是否有环等都是常问的问题....

  • 数据结构之 swift 实现链表反转

    链表反转很熟悉的面试题,关于链表的基础知识就不再累赘了,如何swift实现链表的反转。 传入链表的头结点 返回一个...

  • 理解单链表的反转(java实现)

    要求很简单,输入一个链表,反转链表后,输出新链表的表头。  反转链表是有2种方法(递归法,遍历法)实现的,面试官最...

  • java单链表反转

    要求很简单,输入一个链表,反转链表后,输出新链表的表头。反转链表是有2种方法(递归法,遍历法)实现的,面试官最爱考...

  • 链表的反转

    反转链表是一道很基本的面试题,通过更改节点之间的链接来反转链表。 1.单链表的反转 题目 示例 用一幅图来解释:这...

  • 面试:反转链表

    题目:反转链表要求:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2...

  • 1.数据结构-链表问题

    链表相关问题 删除节点 链表去重 有环链表 反转链表 链表排序 链表相交 其他问题 面试题 02.03. 删除中间...

  • 链表反转

    反转类型问题是面试中的常见问题。如反转字符串,反转链表等,今天给出利用递归和非递归方法解决反转链表问题的两个解决思...

  • Algorithm小白入门 -- 单链表

    单链表递归反转链表k个一组反转链表回文链表 1. 递归反转链表 单链表节点的结构如下: 1.1 递归反转整个单链表...

网友评论

      本文标题:面试:反转链表

      本文链接:https://www.haomeiwen.com/subject/hhdbyhtx.html