一、问题描述
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
二、解决方案
解题思路:(一开始我自己的思路有些问题,这个思路参考了网上的帖子)
删除链表的倒数第n个节点,
(1)首先用两个指针p,q,q一开始指向头节点先不动,p先走
(2)p先走到n-1的位置,q仍指向头节点
(3)然后p和q同时一起顺序沿着链表走,当q走到n-1的位置时,刚好是倒数第n个位置,与此同时,p走到了链表尾部
需要注意几个问题:
(1)考虑链表为空和输入的n值不合法(n<=0)的情况
(2)考虑链表长度小于输入的n
(3)考虑倒数第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) {
ListNode *p, *q, *pre;
if(head == NULL || n<=0){ //链表为空或n的值不合法
return NULL;
}
p = head;
q = head;
for(int i = 0; i < n-1; i++){
if(p->next != NULL){
p = p->next;
}else{
return NULL; //链表长度小于n
}
}
while(p->next != NULL){
p = p->next;
//pre = q;
q = q->next;
}
if(q == head){ //倒数第n个位置是第一个节点,删除整个链表
head = head->next;
}else{
pre = q->next;
q->next = pre->next;
delete pre;
}
return head;
}
};有什么问题请告诉我一下哦~共同学习共同进步!


4743

被折叠的 条评论
为什么被折叠?



