/**
* 19. 删除链表的倒数第N个节点
* @author wsq
* @date 2020/09/16
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
*/
package com.wsq.leetcode;
// Definition for singly-linked list.
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
public class RemoveNthFromEnd {
/**
* 双指针(采用少遍历一个方式,如果是需要被删除的节点为头结点,则tmpN肯定为1,否则为0)
* pNode遍历
* ansNode保存需要删除节点的上一个节点
* 如果tmpN为0: ansNode.next = ansNode.next.next;
* tmpN为1: head.next
* @param head
* @param n
* @return
*/
public ListNode removeNthFromEnd(ListNode head, int n) {
int tmpN = n;
ListNode pNode = head;
ListNode ansNode = head;
while(pNode.next != null) {
if(tmpN != 0) {
tmpN--;
}else {
ansNode = ansNode.next;
}
pNode = pNode.next;
}
if(tmpN == 1) {
return head.next;
}else {
ansNode.next = ansNode.next.next;
return head;
}
}
public static void main(String[] args) {
int[] a = {1, 2, 3, 4, 5};
ListNode head = createList(a);
System.out.println("删除元素前:");
show(head);
RemoveNthFromEnd rm = new RemoveNthFromEnd();
ListNode ans = rm.removeNthFromEnd(head, 2);
System.out.println("删除元素后");
show(ans);
}
/**
* 展示数组内容
* @param a
*/
public static void show(int[] a) {
for(int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
}
/**
* 展示链表内容
* @param head
*/
public static void show(ListNode head) {
while(head != null) {
System.out.print(head.val + " ");
head = head.next;
}
System.out.println();
}
/**
* 创建链表
* @param a
*/
public static ListNode createList(int[] a) {
ListNode head = new ListNode(a[0]);
ListNode pNode = head;
for(int i = 1; i < a.length; i++) {
ListNode tNode = new ListNode(a[i]);
pNode.next = tNode;
pNode = pNode.next;
}
return head;
}
}
19. 删除链表的倒数第N个节点
最新推荐文章于 2025-11-26 15:59:01 发布
本文介绍了一种高效算法,用于删除单链表中倒数第N个节点,通过双指针技巧实现,确保了算法的简洁性和效率。示例代码展示了如何创建链表、遍历链表并执行删除操作。
439

被折叠的 条评论
为什么被折叠?



