LeetCode--删除链表的倒数第N个节点
这道题还是关于链表操作的一道题,这道题也是相对简单的一道题,也算是自己重新温习了一遍链表的知识,当然,数据结构是编程的基础,这一块的内容需要反复打磨。接下来我们来看一下这道题。
这道题我们采用两种方法来求解,本还有一种,但由于能力原因,随后再进行学习。
方法一:
我们先求出链表的长度,用长度来找到倒数第n个节点的值,随后,在通过删除节点的操作来完成算法。
class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { int index = listLength(head)-n+1; if (index == 1) return head->next; for (int i = 1; i < index - 1; i++) { pre = pre->next; } //然后让前一个结点的next指向要删除节点的next pre->next = pre->next->next; return head; } //求链表的长度 int listLength(ListNode* head) { int length = 0; while (head != nullptr) { length++; head = head->next; } return length; } }
因为索引位是倒数第n位的下标,先通过循环慢慢寻找位置,然后在进行链表节点的操作。
方法二:
我们使用两个指针,此处为快慢指针来进行求解。
1、首先我们将头结点赋值给两个指针
2、将快指针先进行n步的移动
3、随后快指针与慢指针保持距离缓步前行
4、等到快指针到边界的时候停止移动
5、这个时候慢指针的下一个位置就是要删除的节点。
原理就是两个指针中间留有n的距离,等到快指针到边界的时候,正好可以得出倒数第n个节点的位置,在对其进行删除即可。
代码如下:
class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* fast=head; ListNode* slow=head; for(int i=0;i<n;i++){ fast=fast->next; } if(fast==nullptr) return head->next; while(fast->next!=nullptr){ fast=fast->next; slow=slow->next; } slow->next=slow->next->next; return head; } };
总结:
本次题目略微简单,在数据结构与算法的课程中也基本都学过,但是奈何当时只是不牢固,现在做起来还是有些吃力。也算是对已学知识进行简要的复习!