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个节点的主要内容,如果未能解决你的问题,请参考以下文章
代码随想录算法训练营第四天 | 24.两两交换链表中的节点19.删除链表的倒数第N个节点160.相交链表142.环形链表II