当前位置: 首页> 汽车> 报价 > 数据结构(Java):链表面试OJ题

数据结构(Java):链表面试OJ题

时间:2025/7/13 21:43:19来源:https://blog.csdn.net/2401_83595513/article/details/140274139 浏览次数: 0次

1、题一:获取链表倒数第k个节点

. - 力扣(LeetCode) 

1.1 思路解析

此题我们使用双指针法求解。

首先,我们要知道,倒数的第k个节点,距离倒数第一个节点还需要移动k-1次

1.那么我们可以定义出两个指针,分别为fast和slow,他们初始均值均为头结点head

2.先让fast指针向后移动k-1次,slow指针保持不动。

3.接着,fast指针和slow指针同步后移直至fast指针指向最后一个节点。

4.此时,slow指针所指向的位置就是倒数第k个节点。

原理:这个解题思路的原理就是,fast指针和slow指针始终保持着k-1个移动次数,而当fast指针指向最后一个节点(即倒数第一个节点)时,那么slow指针指向的就是倒数第k个节点。

注意事项:

1.k的值是否合法 2.头指针head是否为null

1.2 代码

public int kthToLast(ListNode head, int k) {//当头指针为空时if (head == null) {return Integer.MAX_VALUE;}//当k的值<=0时ListNode cur = head;int size = 0;while (cur != null) {size++;cur = cur.next;}if (k <= 0) {return Integer.MAX_VALUE;}//双指针法求解ListNode fast = head;ListNode slow = head;//先让fast指针移动k-1次int count = 0;while (count != k - 1) {fast = fast.next;//当k值>size时(不合法),fast指针移动的k-1次中,必然会指向nullif (fast == null) {return Integer.MAX_VALUE;}count++;}//slow和fast同步后移,直至fast指向倒数第一个元素(slow和fast始终保持k-1个移动次数)while (fast.next != null) {fast = fast.next;slow = slow.next;}//返回valreturn slow.val;}

2、题二:逆置单链表

. - 力扣(LeetCode)

2.1 思路解析

此题我们使用头插法求解。

这道题的思路很简单:从第二个节点开始,每得到一个节点,将此节点进行头插操作。

注意:要将最开始的头结点的next置为null(因为链表的头节点在逆置后就变成了尾结点)

2.2 代码

public ListNode reverseList(ListNode head) {//当头结点head为空时if (head == null) {return head;}//获取第二个节点,将第一个节点的next置为nullListNode cur = head.next;head.next = null;//头插while (cur != null) {//先获取当前节点的下一个节点ListNode curN = cur.next;//将当前节点的next指向头结点(头插)cur.next = head;//将head更新为新头插的节点head = cur;//更新cur,继续头插cur = curN;}//返回逆置后的头结点return head;}

3、题三:移除链表元素(删除所有某一数值的节点,且一次循环)

. - 力扣(LeetCode)

3.1 思路解析

此题我们使用双指针法求解。

1.我们定义两个指针分别为prev(初始指向head头结点 即第一个节点)和cur(初始指向head的next节点 即第二个节点)。

2.遍历链表。

3.当cur所指节点的值为所要删除的val值时,cur向后移动,prev不动,且将prev的next指针指向移动后的cur,完成节点的删除。

4.若cur所指节点值不是所要删除的val值时,cur和prev同步后移一位。

5.当cur指向null时,遍历完成。

6.经过上述操作,除第一个节点外,其余的节点均已删除完成,我们只需额外判断第一个节点的值是否为要删除的val值即可。

3.2 代码

public ListNode removeElements(ListNode head, int val) {//当head为空时if(head == null) {return head;}//双指针法求解ListNode prev = head;ListNode cur = head.next;while (cur != null) {//判断当前节点的值是否为要删除的val值if (cur.val == val) {//若是,删除节点cur = cur.next;prev.next = cur;}else {//若不是,均向后移动cur = cur.next;prev = prev.next;}}//判断第一个节点的值是否我要删除的val值。if (head.val == val) {head = head.next;}//返回删除后的头结点return head;}

4、获取链表的中间节点

. - 力扣(LeetCode)

 4.1 思路解析

此题我们使用快慢指针法求解。

1.首先,定义两个指针分别为fast和slow。

2.fast指针,每次向后移两位;slow指针,每次向后移一位。

3.链表元素个数为奇数时,当fast.next == null时,slow指向的节点就是中间节点;链表元素个数为偶数时,当fast == null时,slow指向的节点就是中间节点。

注意:

循环结束条件一定要写为:

while(fast != null && fast.next != null)

原因:

1.两者只要有一个不满足就要结束循环,说明已经找到了中间节点

2.一定要fast != null在前,避免fast.next时出现空指针异常

4.2 代码

public ListNode middleNode(ListNode head) {//快慢指针法求解ListNode slow = head;ListNode fast = head;//找中间节点//一定要fast != null在前,避免出现空指针异常//两个条件只要有一个不满足就结束循环,说明到了中间节点的位置while (fast != null && fast.next != null) {ListNode fastN = fast.next;fast = fastN.next;slow = slow.next;}//返回中间节点return slow;}

关键字:数据结构(Java):链表面试OJ题

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: