题目:
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]
解题思路:
方法1:获取长度
- 将头节点建立一个0值的对象(避免删除头节点)
- 计算出链表的总长度
- 总长度减去n得到走多少个节点到倒数第n个节点的前一个节点
- 最后直接指向下下个节点即可
public ListNode removeNthFromEnd(ListNode head, int n) {
// 在n的位置的前一个节点直接指向n位置后的一个节点
ListNode nummpy =new ListNode(0, head);
ListNode cur = nummpy;
// 获取长度
int length = getLength(head);
for (int i = 0; i < length - n ; i++) {
cur = cur.next;
}
cur.next = cur.next.next;
ListNode ans = nummpy.next;
return ans;
}
public static int getLength(ListNode head) {
int length = 0;
while (head != null) {
++length;
head = head.next;
}
return length;
}
方法2: 双指针
- 在头节点之前建立一个pre节点
- first节点指向头节点并且先走n个节点(当first节点到最后的时候 pre节点能正好在删除节点之前)
- 最后2个节点一起往后移动知道first节点为空
- 最后返回pre.next节点
public ListNode removeNthFromEnd(ListNode head, int n) {
// 在n的位置的前一个节点直接指向n位置后的一个节点
ListNode nummpy = new ListNode(0, head);
ListNode cur = nummpy;
ListNode first = head;
for (int i = 0; i < n; i++) {
first = first.next;
}
while (first != null) {
first = first.next;
cur = cur.next;
}
cur.next = cur.next.next;
ListNode ans = nummpy.next;
return ans;
}