链表二交换元素和删除元素
24两两交换链表元素
1.题目
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
2.解题思路
利用三个指针cur,curnext,curfront,每次取cur和curnext两个节点判断是否为空,不为空执行两个节点交换操作。交换完更新cur和curfront,并将cur串联到curfront后面。
3.代码实现
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* dummyHead=new ListNode(0);
dummyHead->next=head;
ListNode* cur=head;
ListNode* curfront=dummyHead;
int i=1;
while(cur!=nullptr&&cur->next!=nullptr)
{
ListNode* tmp=cur->next->next;
//交换代码
//ListNode* tmpp=cur;
curfront->next=cur->next;
cur->next->next=cur;
cout<<i++<<endl;
//更新cur和curfront
curfront=cur;
cur=tmp;
curfront->next=cur;//将这二者关联上
}
return dummyHead->next;
}
};
4.注意事项
不是在变量定义时写了curfront和cur这两者就自动能关联上,必须通过next将这二者关系关联上。程序最初缺少这一句始终报错,运行超时。
19.删除链表倒数第n个元素
1.题目描述
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
2.解题思路
双指针找到倒数第n个元素的前一个
删除是将该元素的下一个指向下下个元素,并且delete掉倒数第n个元素。
3.代码实现
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead=new ListNode(0);
dummyHead->next=head;
ListNode *p=dummyHead;
ListNode *q=dummyHead;
//利用快慢指针
cout<<n<<endl;
int i=0;
while((n--)&&p->next!=nullptr)
{
p=p->next;
cout<<n<<endl;
}
while(p->next!=nullptr)
{
q=q->next;
p=p->next;
cout<<"i的值"<<i++<<endl;
}
//执行删除
p=q->next;//
q->next=q->next->next;//更新q下一个节点
delete p;
p=nullptr;
return dummyHead->next;
}
};
4.注意
-
获取数组或链表倒数第n个元素都可以用双指针法,快指针先走n步,慢指针再开始跟快指针一起走,快指针走到结尾时慢指针刚好走到倒数第n个元素。
-
注意快指针和慢指针开始指的位置及走的步数,不确定可以在纸上举个例子走走看。
-
链表删除倒数第n个元素是要将当前指针先知道它的前一个元素去。
走n步,慢指针再开始跟快指针一起走,快指针走到结尾时慢指针刚好走到倒数第n个元素。
-
注意快指针和慢指针开始指的位置及走的步数,不确定可以在纸上举个例子走走看。
-
链表删除倒数第n个元素是要将当前指针先知道它的前一个元素去。
-
双指针下次写成成fast和slow,不要写p和q,否则赋值时容易弄混