19. 删除链表的倒数第N个节点

Posted boboboo610

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了19. 删除链表的倒数第N个节点相关的知识,希望对你有一定的参考价值。

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

法一:

 1 public ListNode removeNthFromEnd(ListNode head, int n) {
 2 
 3         ListNode dumy = new ListNode(0);
 4         dumy.next = head;
 5         ListNode node = dumy;
 6         int num = 1;
 7         //计算出一共有多少个节点(链表数+1)
 8         while (node.next != null) {
 9             node = node.next;
10             num++;
11         }
12         ListNode node2 = dumy;
13         int k = num - n - 1;
14         for (int i = 0; i < k; i++) {
15             node2 = node2.next;
16         }
17         node2.next = node2.next.next;//找到删除节点的前一个节点
18         return dumy.next;
19 
20     }

一次计算节点个数,一次查找删除节点

 

法二:

 1 //    双节点法,一次遍历,相隔n个节点,同时向后移动,前节点到尾,后节点正好为删除节点的前一个节点,删除操作。
 2 
 3     public ListNode removeNthFromEnd2(ListNode head, int n) {
 4         stNode dummy = new ListNode(0);
 5         dummy.next = head;
 6         ListNode first = dummy;
 7         ListNode second = dummy;
 8 
 9         for (int i = 1; i <= n ; i++) {
10             first = first.next;
11         }
12 
13         while (first.next != null) {
14             first = first.next;
15             second = second.next;
16         }
17         second.next = second.next.next;
18         return dummy.next;
19     }

 

以上是关于19. 删除链表的倒数第N个节点的主要内容,如果未能解决你的问题,请参考以下文章

19. 删除链表的倒数第N个节点

19. 删除链表的倒数第N个节点

Lc19_删除链表的倒数第N个节点

LeetCode 19删除链表的倒数第N个节点

Leetcode 19 删除链表的倒数第 N 个节点

代码随想录算法训练营第四天 | 24.两两交换链表中的节点19.删除链表的倒数第N个节点160.相交链表142.环形链表II