1、删除链表的倒数第N个结点(LCR021题)
题目描述:给定一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
解法:首先要知道,在链表中我们要删除某个节点,指针必须指向该节点的前一个节点才能对该节点实行一个删除的操作!所以这里很巧妙的使用了双指针,slow 指针和 fast 指针。fast 指针是用于确定倒数第n个节点的位置,而 slow 指针则是定位倒数第n个节点前一个节点的位置。
这里有个很巧妙的构思,首先 我们使用了虚拟头节点,指向头节点的位置,并且设置 slow 和 fast 指针都指向虚拟头节点的位置,然后先将 fast 向右边移动 n + 1个位置。然后再同步向右移动 fast 和 slow 指针,这样使得当fast指向Null的时候,slow必定在倒数第 n 个节点的前一个位置,以此来执行删除操作。
代码如下:
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummyhead = new ListNode(0);
dummyhead.next = head;
ListNode slow = dummyhead;
ListNode fast = dummyhead;
while(n != 0 && fast != null){
if(fast.next != null)
{
fast = fast.next;
n--;
}else{
return head;
}
}
while(fast.next != null){
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return dummyhead.next;
}
}
2、环形链表(LCR022题)