题目
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
解法一:先算出链表长度然后遍历寻找
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode h = new ListNode(); //先为链表赋一个头指针
h.next = head;
ListNode p = h; //设置p指针用于遍历
int len = 0;
//遍历一遍链表,算出链表长度
while(p.next != null){
len++;
p = p.next;
}
int i = 0;
p = h;
//如果n大于链表长度,直接返回
if(n>len){
return head;
}
//如果链表只有一个数,head直接置空
else{
while(i < len - n){
p = p.next;
i++;
}
p.next = p.next.next;
}
return h.next;
}
}
解法二:快慢指针求解
定义两个指针,初始时位置相差为n,然后两个指针一起向后移动,当后面的指针到链表尾时,前面的指针就指向倒数第n个结点了。
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode fast = head;
ListNode slow = head;
//fast移n步,
for (int i = 0; i < n; i++) {
fast = fast.next;
}
//如果fast为空,表示删除的是头结点
if (fast == null)
return head.next;
while (fast.next != null) {
fast = fast.next;
slow = slow.next;
}
//这里最终slow不是倒数第n个节点,他是倒数第n+1个节点,
//他的下一个结点是倒数第n个节点,所以删除的是他的下一个结点
slow.next = slow.next.next;
return head;
}
解法二来源:力扣(LeetCode)
作者:数据结构和算法
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xn2925/?discussion=9Dqd9Q