删除链表的倒数第N个节点
Posted Delta
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除链表的倒数第N个节点相关的知识,希望对你有一定的参考价值。
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.
一种方法是先计算链表的长度N,然后定位到第(N-n)个节点,删除节点(N-n+1)也即(倒数第n个节点)
代码如下:
public static ListNode removeNthFromEnd(ListNode head, int n) { // 新建一个节点temp // temp.next = head可以保存链表的头结点 // 也方便处理删除的是第一个节点(倒数第N个) ListNode temp = new ListNode(0); temp.next = head; int N = 0; // Get the length of the list while (head != null) { N++; head = head.next; } N = N-n; head = temp; // Locate the (N-n)th node while (N>0) { head = head.next; N--; } head.next = head.next.next; return temp.next; }
第二种方法是,使用两个指针,首先将第一个指针置于第二个的后n+1个节点处。再同时移动两个指针,当第一个指向链表末尾时,第二个指针指向第(N-n)个节点。
以n=2为例,即删除倒数第二个节点
指针2指向开始处,指针1与指针2相隔为(n+1)
同时移动指针1与2,当1指向null时,二指向倒数第(n+1)个节点。
代码如下:
public static ListNode test(ListNode head, int n) { ListNode temp = new ListNode(0); temp.next = head; ListNode p = temp; ListNode q = temp; while (n+1>0) { q = q.next; n--; } while (q != null) { p = p.next; q = q.next; } p.next = p.next.next; return temp.next; }
以上是关于删除链表的倒数第N个节点的主要内容,如果未能解决你的问题,请参考以下文章
代码随想录算法训练营第四天 | 24.两两交换链表中的节点19.删除链表的倒数第N个节点160.相交链表142.环形链表II