1.一个单链表,如何操作将整个链表进行反转?
方式一:使用Stack栈
创建 Stack<Integer> 保存链表结点数据,遍历原链表将所有数据入栈,再新建结果链表,不断弹出栈顶元素尾插进新链表,以此完成链表反转。
核心代码实现
方式二:原地反转
初始化pre为空、cur指向链表头,遍历链表,先用temp保存当前结点的后继,将当前结点反向指向pre,再依次移动pre和cur;遍历结束,pre就是反转后的链表头,实现原地反转。
核心代码实现
2.判断链表是否有环
方式一:用Set集合检查链表中是否存在重复的节点对象
新建一个HashSet集合,从头开始遍历链表,每访问一个结点就尝试把结点对象存入集合;如果添加失败,说明该结点之前访问过,链表存在环;若遍历走到null结束,则链表无环。
方式二:使用快慢指针
设置快慢指针都从头结点出发;慢指针每次移动一步,快指针每次移动两步;若无环,快指针先抵达链表末尾;若存在环,快指针会在环内追上慢指针,两指针相遇,以此判断链表是否含有环。