如何通过一次遍历删除链表倒数第N个元素

给定一个链表,删除链表的倒数第n个节点,并且返回链表的头结点。本篇经验将分享一个快慢指针算法,在O(1)的空间复杂度下返回结果。声明链表节点类首先,我们需要声明一个链表节点类,用于构建链表结构。```

给定一个链表,删除链表的倒数第n个节点,并且返回链表的头结点。本篇经验将分享一个快慢指针算法,在O(1)的空间复杂度下返回结果。

声明链表节点类

首先,我们需要声明一个链表节点类,用于构建链表结构。

```java

public class ListNode {

int val;

ListNode next;

ListNode(int x) { val x; }

}

```

通过快慢指针找到倒数第n个元素

我们可以通过两个间隔为n的节点指针,找到倒数第n个元素。

首先,初始化两个指针,分别指向链表的头部。然后,将快指针向前移动n步。接着,快指针和慢指针一起向前移动,直到快指针遍历完链表。此时,慢指针会指向倒数第n个节点元素。需要注意的是,如果快指针向前移动n步之后已经为空,则说明我们要删除的是第一个元素。

```java

public ListNode removeNthFromEnd(ListNode head, int n) {

ListNode dummy new ListNode(0);

head;

ListNode fast dummy;

ListNode slow dummy;

// 快指针先向前移动n步

for (int i 0; i < n; i ) {

fast ;

}

// 快慢指针一起向前移动,直到快指针遍历完链表

while (fast ! null) {

fast ;

slow ;

}

// 删除倒数第n个节点

;

return ;

}

```

输出链表

为了验证算法的正确性,我们可以编写代码输出整个链表。

```java

public void printList(ListNode head) {

ListNode curNode head;

while (curNode ! null) {

( " ");

curNode ;

}

();

}

```

测试代码

在主方法中,我们可以构建一个链表并调用上述方法删除倒数第n个元素,并将结果输出到控制台。

```java

public static void main(String[] args) {

Solution solution new Solution();

ListNode head new ListNode(1);

ListNode node2 new ListNode(2);

ListNode node3 new ListNode(3);

ListNode node4 new ListNode(4);

ListNode node5 new ListNode(5);

node2;

node3;

node4;

node5;

int n 2;

ListNode result (head, n);

(result);

}

```

运行结果

运行主方法,观察控制台输出,可以验证算法的正确性。

```

1 2 3 5

```

提交算法

最后,我们可以将算法提交到面试平台进行测试。

标签: