给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.
解题思路1:两次遍历链表,第一次遍历求出链表的长度l,然后再遍历一次,找到第l-n个节点,将此节点的next指向下一个节点的next,实现删除该节点的后一个节点,即倒数第n个节点。(设置一个头指针,防止链表中只有一个节点的情况)
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
int l = 0;
ListNode start = head;
while(start != null){
l++;
start = start.next;
}
ListNode tmp = new ListNode(-1);
tmp.next = head;
start = tmp;
int s = l-n;
while(s > 0){
start = start.next;
s--;
}
start.next = start.next.next;
return tmp.next;
}
}
解题思路2:首先设置一个指针,指向链表的第n个节点,然后再设置一个头指针,next指向头节点,这样两个指针之间就相差n个节点,最后同时移动两个指针,直到第一个指针指向链表尾部,这时后指针的next所指就是要删除的节点,将节点删除即可。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode tmp = new ListNode(-1);
tmp.next = head;
ListNode fast = head,slow = tmp;
while(n>0){
fast = fast.next;
n--;
}
while(fast != null){
slow = slow.next;
fast = fast.next;
}
slow.next = slow.next.next;
return tmp.next;
}
}