力扣:19. 删除链表的倒数第 N 个结点
温馨提示:
本文最后更新于 2024年09月19日,已超过 218 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
package intermediate;
/**
* 题目:19. 删除链表的倒数第 N 个结点
* 难度:中等
* 需求:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
* 原题链接: https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/
*/
public class removeLinkNodeFromEnd {
/**
*解题思路:先遍历一遍链表从而获取链表的长度,随后使用连边长度减去要删除的倒数第n个结点
* 从而获取正序的节点下标,然后再记录一下此次遍历时的下标,当次下标(遍历时的下标)和
* 前面计算出来的下标(要删除元素的下标)一致时直接删除该下标即可。
*/
public static ListNode removeNthFromEnd(ListNode head, int n) {
ListNode linkNode = head;
//获取链表长度
int linkLen = getNumberOfNodes(head);
int index2 = linkLen - n;
//如果长度为1获取需要删除的是头节点直接返回下一个节点即可
if (linkLen==1||index2==0) return head.next;
//记录当前下标
int index = 1;
//遍历如果当前下标符合要删除的下标值则直接删除阶段,否则继续遍历链表
while (linkNode.next != null) {
if (index==index2){
linkNode.next = linkNode.next.next;
index++;
}else{
linkNode = linkNode.next;
index++;
}
}
return head;
}
//统计链表长度
public static int getNumberOfNodes(ListNode head) {
int linkLen = 1;
ListNode linkNode = head;
while (linkNode.next != null) {
linkNode = linkNode.next;
linkLen++;
}
return linkLen;
}
public class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
}
正文到此结束
- 本文标签: 算法
- 本文链接: https://ssadan-blog.cn/article/20
- 版权声明: 本文由sadan原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权