【269期】链表高频面试题(包括反转、合并、相交、分割、环长等)

【269期】链表高频面试题(包括反转、合并、相交、分割、环长等)

1.整个链表翻转

https://leetcode-cn.com/problems/reverse-linked-list/

1.1 题目描述

反转一个单链表。

示例:

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

进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

1.2 算法实现

1.2.1 算法思路

双指针:一个指针pre指向原链表当前节点的前一个节点,另一个指针next暂存当前节点的下一个节点。

依次遍历链表的各个节点,每遍历一个节点即将其指向前一个节点(倒置),主要分4步:

  1. 先备份后一个节点(以防移动指针的时候找不到下一个节点):next = head.Next;
  2. 后一个节点的Next指向前一个节点:next.Next = pre;
  3. 前置节点后移一个位置到当前节点:pre = head;
  4. 后置节点后移一个位置到下一个节点:head = next,注意这一步(千万不要)容易忽略。

1.2.2 代码实现

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */

func partition(head *ListNode, x int) *ListNode {
    //var preHead, postHead *ListNode     // 前后两部分链表的头结点,不能这么声明,这样声明的话两者都为&ListNode{0, nil}其中Next域为nil,当运行到prePtr.Next = head时会报panic: runtime error:invalid memory address or nil pointer deference错误
    preHead := &ListNode{0, nil}        // 生成一个preHead链表的头结点,该节点固定一直不对其移动,改头节点的Val为多少都不影响结果,因为使用的是头结点的Next节点
    postHead := &ListNode{0, nil}       // 生成一个postHead链表的头结点,该节点固定不动
    prePtr := preHead                   // prePtr指针对preHead链表进行遍历,注意:开始时其指向preHead
    postPtr := postHead
    for head != nil {                   // 遍历原链表
        if(head.Val < x ){              // 小于x的节点尾插到preHead链表后面
            prePtr.Next = head          // prePtr的Next域指向当前节点,即将当前节点从preHead链表尾部prePtr依次插入
            prePtr = head               // prePtr指针后移一位,指向当前节点
        }else{                          // 大于等于x的节点放在postHead链表的后面
            postPtr.Next = head         // 将当前节点插入到postHead链表尾节点postPtr后面
            postPtr = head              // postHead链表的尾节点后移一位
        }
        head = head.Next                // 当前指针后移一位
    }
    // 对head链表遍历结束分为preHead和postHead两个子链表
    prePtr.Next = postHead.Next         // 注意:这里是将preHead链表的尾节点prePtr的Next域指向postHead链表头结点的下一个节点
    postPtr.Next = nil                  // postPtr的尾节点的Next域指向空
    return preHead.Next                 // 返回preHead链表的Next之后的链表
}


来源:gonline.blog.csdn.net/article/details/104187852

END

十期推荐

【251期】面试官:谈谈你对零拷贝的理解~
【252期】运行时常量池的一道面试题(JDK8环境)
【253期】面试官:熟悉Docker操作吗?说几个常用的Docker命令吧
【254期】面试官:来谈谈微服务组件Feign的工作原理吧
【255期】面试官:Mybatis是如何运用设计模式的?
【256期】面试官常考的 21 条 Linux 命令
【257期】面试官:谈谈你对Java线程安全与不安全的理解
【258期】今日头条的面试题:LRU原理和Redis实现
【259期】面试官:Spring事务失效的场景有哪些?如何解决?
【260期】Java线程池,这篇能让你和面试官聊了半小时


与其在网上拼命找题? 不如马上关注我们~

【269期】链表高频面试题(包括反转、合并、相交、分割、环长等)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/8145.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!