题目
给定一个链表,删除链表的倒数第 n 个节点并返回头结点。例如:
给定一个链表: 1->2->3->4->5, 并且 n = 2.
当删除了倒数第二个节点后链表变成了 1->2->3->5.
说明:
- 给的 n 始终是有效的。
- 尝试一次遍历实现。
算法思想
两个指针first,second,第一个指针首先步进n步,之后,两个指针一起步进,当第一个指针first到达链表尾部时,第二个指针指向的即为链表中的倒数第n个节点
算法实现
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode first;
ListNode second;
ListNode pre;
first = head;
second = head;
pre = second;
int index = 0;
while (index < n) {
first = first.next;
index++;
}
while (first != null) {
pre = second;
second = second.next;
first = first.next;
index++;
}
//删除节点
pre.next = second.next;
//只有一个节点
if (index == 1) {
return null;
} else if (head == second) {
//删除的是头节点
return head.next;
} else {
//删除的是非头节点
return head;
}
}