Leetcode链表easy | 19. 删除链表的倒数第N个节点
程序员文章站
2024-03-06 10:36:19
...
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(head==nullptr || n<=0) // 输入异常检测:链表是否为空或数值n是否小于等于0
return NULL;
ListNode* node=new ListNode(0); // 涉及删除操作,新建头结点,以便所有节点的操作一致
node->next=head; // 新的头节点连接上原链表
ListNode* h =node; // 动态指针
int len=0; // 计算链表长度
while(h->next){
h=h->next;
len++;
}
int step = len-n; // 计算需要走的步数
if(step<0) // 若步数超过链表长度
return NULL;
h=node; // 动态指针归位
for(int i=0;i<step;i++){
h=h->next;
} // 动态指针走到待删除节点的前一个节点,注意是前一个节点而不是那个待删除的节点
h->next=h->next->next; // 删除给定节点
return node->next; // 返回头结点的的下一个节点,注意不是返回head
}
};
注意的地方:输入的异常检测,删除操作新建头节点,计算链表长度,指针走到待删除节点的前一个节点