最近开始刷链表题目
1.思路
有两种思路
a. 两次遍历法:第一次遍历确认链表长度,第二次遍历删除第L-n+1个节点(即倒数第n个节点);
b.一次遍历(利用双指针实现),使用两个指针,两个指针相距n个节点,这样当第一个指针遍历到链表尾部时,第二个指针位置为倒数第n个节点
2.代码
/**
* 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) {
/*
思路:
两种方法
1.两边遍历,找到链表长度,然后删除第L-n+1 个节点
2.采用双指针法,双指针同步走
*/
ListNode *Dummynode = new ListNode(0);
Dummynode->next = head;
int length = 0;
ListNode * first = head;
while(first)
{
length++;
first=first->next;
}
length = length - n;
first = Dummynode;
while(length>0)
{
length--;
first = first->next;
}
ListNode* delnode = first->next;
first->next = delnode->next;
delete delnode;
return Dummynode->next;
}
};
/**
* 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) {
/*
思路:
两种方法
1.两边遍历,找到链表长度,然后删除第L-n+1 个节点
2.采用双指针法,双指针同步走
*/
ListNode *Dummynode = new ListNode(0);
Dummynode->next = head;
ListNode* p = Dummynode;;
ListNode* q = Dummynode;
for(int i=0; i<n+1; i++)
{
q = q->next;
}
while(q)
{
q = q->next;
p = p->next;
}
ListNode* delnode = p->next;
p->next = delnode->next;
delete delnode;
ListNode* resnode = Dummynode->next;
delete Dummynode;
return resnode;
}
};