leetcode-双指针-19
/**
* <p>给你一个链表,删除链表的倒数第 <code>n</code><em> </em>个结点,并且返回链表的头结点。</p>
*
* <p> </p>
*
* <p><strong>示例 1:</strong></p>
* <img alt="" src="https://assets.leetcode.com/uploads/2020/10/03/remove_ex1.jpg" style="width: 542px; height: 222px;" />
* <pre>
* <strong>输入:</strong>head = [1,2,3,4,5], n = 2
* <strong>输出:</strong>[1,2,3,5]
* </pre>
*
* <p><strong>示例 2:</strong></p>
*
* <pre>
* <strong>输入:</strong>head = [1], n = 1
* <strong>输出:</strong>[]
* </pre>
*
* <p><strong>示例 3:</strong></p>
*
* <pre>
* <strong>输入:</strong>head = [1,2], n = 1
* <strong>输出:</strong>[1]
* </pre>
*
* <p> </p>
*
* <p><strong>提示:</strong></p>
*
* <ul>
* <li>链表中结点的数目为 <code>sz</code></li>
* <li><code>1 <= sz <= 30</code></li>
* <li><code>0 <= Node.val <= 100</code></li>
* <li><code>1 <= n <= sz</code></li>
* </ul>
*
* <p> </p>
*
* <p><strong>进阶:</strong>你能尝试使用一趟扫描实现吗?</p>
* <div><div>Related Topics</div><div><li>链表</li><li>双指针</li></div></div><br><div><li>👍 1953</li><li>👎 0</li></div>
*/
//leetcode submit region begin(Prohibit modification and deletion)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode p = findFromEnd(dummy, n + 1);
p.next = p.next.next;
return dummy.next;
}
/**
* 5个节点,倒数第三个既第2个节点;要删除2就要找到第1个节点
* 5-3=2,传入的虚拟节点既 6-3 = 3;是原先链表的第二节点
*
* @param head
* @param k
* @return
*/
ListNode findFromEnd(ListNode head, int k) {
ListNode p1 = head;
for (int i = 0; i < k; i++) {
p1 = p1.next;
}
ListNode p2 = head;
while (p1 != null) {
p1 = p1.next;
p2 = p2.next;
}
return p2;
}
}
//leetcode submit region end(Prohibit modification and deletion)
不恋尘世浮华,不写红尘纷扰