给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
先遍历一遍把所有的结点存入vector容器,再设置两个指针,位置分别是left-1和right-;开始向中心移动,将遍历到的值交换,最后将所有结点穿起来。
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int left, int right) {
if(head==NULL||head->next==NULL)
{
return head;
}
vectorv;
ListNode* p;
while(head!=NULL)
{
v.push_back(head);
head=head->next;
}
int l=left-1,r=right-1;
while(lnext=v[i];
p=p->next;
}
p->next=NULL;
return head;
}
};
237. 删除链表中的节点
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点 。
现有一个链表 – head = [4,5,1,9],它可以表示为:
示例 1:
输入:head = [4,5,1,9], node = 5
输出:[4,1,9]
解释:给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
这题一开始想着就直接遍历一遍,整一个指针指向遍历的结点,遇到val和所给节点val相同的结点,就让指针直接指向下下个结点就好(直接跳过目标节点),但写了一半后发现这题没那么简单,它没有给你链表的头结点,只给了你要删除的结点,这样你就没法遍历了,而且咋删除这个结点也是个问题。后来经指点后发现,我不一定要杀了自己,我可以装成一个人的样子,然后把那个人杀了就行(吉良吉影点了个赞),于是直接把node的结点的下一个结点的val赋值给自己,再直接跳过那个节点就行,这样遍历下来,看起来就像是node被删除了一样。(虽然它还在)(这题细想后觉得有点吓人嘞)
class Solution {
public:
void deleteNode(ListNode* node) {
node->val=node->next->val;
node->next=node->next->next;
}
};
19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
进阶说了,要我们只用一次遍历,所以不能用之前存进vector容器里的方法了,问题是不知道链表有多长,怎么知道第几个结点是倒数第n个,后来想到了用快慢指针的方法,设一个结点o,让这个结点的next指向head,再用两个结点p,q等于o,再设一个值num计算两个指针之间的结点,然后开始遍历,先让q向前移动,每移动一个结点判断两个指针之间的结点数即num是否大于n,如果大于,则p也向下移动一位,如果没有,则num++。这样当q指向null时(到达结尾),p的next指向的就是倒数第n个结点了,让p之间跳过下一个结点,最后返回o->next即可。
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* p,*q,*o;
o=(ListNode*)malloc(sizeof(ListNode));
o->next=head;
p=o;
q=o;
int num=0;
while(q!=NULL)
{
q=q->next;
if(num>n)
{
p=p->next;
}
num++;
}
p->next=p->next->next;
head=o->next;
return head;
}
};



