题目描述
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
- 给定一个链表: 1->2->3->4->5, 和 n = 2.
- 当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
- 给定的 n 保证是有效的。
进阶:
- 使用一趟扫描实现
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
- 先遍历一遍,找出列表的长度length。
- 用index存储要删的节点在这个列表中的第几个节点(index = length - n + 1)
- 再遍历列表,将节点定位到删除节点(deleteNode)的前一个节点
- 将当前节点(即deleteNode的前一个节点)的next指针指向deleteNode的下一个节点
- 如果删除节点为头节点(head),即index==1的时候,直接head = head.next。
Java代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode node = head;
int length = 0;
while (node != null) {
node = node.next;
length++;
}
int index = length - n + 1;
node = head;
if (index == 1) {
head = head.next;
return head;
} else {
while (index-- > 2) {
node = node.next;
}
node.next = node.next.next;
}
return head;
}
}
注: 以上代码不一定是最优解,如果你有更好的想法,快去尝试吧!