题目:
给定一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例一:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
提示:
链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
代码:双指针
package jianzhioffer;
import java.util.List;
public class offer_21 {
public static void main(String[] args) {
// 初始化节点
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
ListNode node4 = new ListNode(4);
ListNode node5 = new ListNode(5);
// 初始化链表并添加节点
LinkList list = new LinkList();
list.add(node1);
list.add(node2);
list.add(node3);
list.add(node4);
list.add(node5);
int n = 2;
// 头结点
ListNode head = node1;
// 删除节点
ListNode res = removeNtbFromEnd(head, n);
// 遍历节点
while (res != null) {
System.out.println(res.val);
res = res.next;
}
}
public static ListNode removeNtbFromEnd(ListNode head, int n) {
ListNode left = head;
ListNode right = head;
for (int i = 0; i < n; i++) {
right = right.next;
}
if (right == null) return head.next;
while (right != null) {
right = right.next;
if (right == null) {
break;
}
left = left.next;
}
left.next = left.next.next;
return head;
}
/**
* 结点类
*/
static class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode (int val) {
this.val = val;
}
ListNode (int val, ListNode next) {
this.val = val;
this.next = next;
}
}
/**
* 链表类
*/
static class LinkList {
ListNode head = new ListNode(0);
/**
* 在链表结尾添加元素
*/
public void add(ListNode node) {
ListNode temp = head;
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = node;
}
}
}
解题思路:
1、初始化两个指针left、right都指向头结点
2、先让right指针右移n步
3、然后让left 和 right同时向后移动,直到right的下一个节点为空
4、此时left所指向的下一个节点就是要删除的倒数第n个结点
参考链接: