标签:时移 节点 lis div The 方法 inf new 两个指针
给定一个链表,删除链表的倒数第 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; }
标签:时移 节点 lis div The 方法 inf new 两个指针
原文地址:https://www.cnblogs.com/deltadeblog/p/8947307.html