BM2 链表内指定区间反转

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    public ListNode reverseBetween (ListNode head, int m, int n) {
        // write code here
        //1.首先设置一个虚拟的头节点
        ListNode dummyNode = new ListNode(-1);
        dummyNode.next = head;
        
        //2.指向相应的标志位
        ListNode left = dummyNode;
        for(int i = 0;i < m-1;i++)
        {
            left = left.next;
        }
        ListNode first = left.next;
        ListNode last = first;
        for(int i = 0;i < n-m;i++)
        {
            last = last.next;
        }
        ListNode right = last.next;
        
        //3.断开相应的链接,形成真正的子链
        left.next = null;
        last.next = null;
        
        //4.调用反转的函数进行反转
        reverseList(first);
        
        //5.最后重新进行链接
        left.next = last;
        first.next = right;
        
        //6.返回头节点
        return dummyNode.next;
    }
    
    public ListNode reverseList(ListNode head)
    {
        ListNode pre = head;
        ListNode cur = head.next;
        ListNode next = null;
        while(cur != null)
        {
            next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }
        return pre;
    }
}
### 并查集(Union-Find)数据结构及其基本操作 并查集是一种用于处理动态连通性的高效数据结构,主要用于解决集合的合并与查询问题。它常被应用于图论中的连通分量检测、最小生成树算法(Kruskal)、以及社交网络分析等领域。 #### 数据结构定义 并查集的核心思想是维护一组不相交的动态集合,支持两种主要的操作:查找(Find)和合并(Union)。该数据结构可以通过数组实现,其中每个元素存储其父节点的位置,形成一棵或多棵森林状的树形结构[^1]。 #### 基本操作 1. **查找(Find)** 查找操作的目标是找到某个元素所属集合的代表元(即根节点),并通过路径压缩优化提升后续查找的速度。具体来说,在每次查找过程中,可以将沿途经过的所有节点直接连接到根节点上,从而降低树的高度。 2. **合并(Union)** 合并操作的作用是将两个不同的集合合并成一个新的集合。这一过程通常是先分别调用两次 `find` 方法获取两棵树的根节点,再将其中一个根节点作为另一个根节点的父亲节点完成合并。为了保持平衡性,还可以引入按秩合并策略——总是让较矮的树成为较高的树的孩子节点。 ```python class UnionFind: def __init__(self, size): self.parent = list(range(size)) self.rank = [0] * size def find(self, p): if self.parent[p] != p: self.parent[p] = self.find(self.parent[p]) # 路径压缩 return self.parent[p] def union(self, p, q): rootP = self.find(p) rootQ = self.find(q) if rootP == rootQ: return False if self.rank[rootP] > self.rank[rootQ]: self.parent[rootQ] = rootP elif self.rank[rootP] < self.rank[rootQ]: self.parent[rootP] = rootQ else: self.parent[rootQ] = rootP self.rank[rootP] += 1 return True ``` --- ### 数据结构面试常见问题及解决方案 以下是针对数据结构部分的一些典型面试题目及相关解答: 1. **链表反转** 实现单向链表的原地反转功能,需注意边界条件如空列表或只有一个节点的情况。 2. **二叉树遍历** 掌握前序、中序、后序三种递归与非递归方式下的遍历方法,并理解它们之间的区别[^3]。 3. **堆排序** 学习如何构建最大/最小堆,并基于此设计高效的优先队列管理机制。 4. **哈希冲突解决办法** 讨论开放寻址法(Open Addressing) 和拉链法(Separate Chaining),比较两者优劣适用场景。 5. **字符串匹配算法** KMP(Knuth-Morris-Pratt), BM(Boyer-Moore)等高级模式匹配技术原理剖析及时空复杂度评估。 6. **拓扑排序** 使用DFS或者BFS实现DAG(Directed Acyclic Graphs)上的线性排列顺序计算。 7. **LCA (Lowest Common Ancestor)** 给定一颗二叉树,求任意两点最近公共祖先的方法探讨。 8. **区间覆盖问题** 利用贪心思想解决最优子结构特性明显的资源分配类难题。 9. **字典树(Trie Tree)应用实例讲解** 10. **动态规划经典案例解析**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值