代码随想录算法训练营第四天 | ●24. 两两交换链表的节点 19.删除链表的倒数第N个节点160.链表相交142.环形链表II18期
24. 两两交换链表中的节点
思路:加入一个虚拟头节点,再通过虚拟头节点将之后两个节点更换位置,将虚拟头节点之后的第一个节点用指针tmp指向它,用tmp1指向第二个节点之后的位置(可能是一个节点也可能是NULL),按照代码随想录里的顺序就可以了。
-
ListNode* swapPairs(ListNode* head) {
-
-
ListNode* pNode = new ListNode(0);
-
pNode->next = head;
-
ListNode* cur = pNode;
-
while(cur->next!= NULL && cur->next->next!=NULL ){
-
ListNode* tmp = cur->next;
-
ListNode* tmp1= cur->next->next->next;
-
-
cur->next = tmp->next;
-
cur->next->next = tmp;
-
cur->next->next->next = tmp1;
-
-
cur = cur->next->next;
-
-
}
-
-
head = pNode->next;
-
delete pNode;
-
return head;
-
-
}
19.删除链表的倒数第N个节点
通过双指针里,快指针先走n 1步,慢指针指向虚拟头节点,同时走,直到快指针走到链表的末尾,突出一个相对距离。就是两个指针相距n 1个链表节点,这样子就能够找到倒数n个节点,就像一个能存n个节点的窗口,右边界碰到末尾的NULL,左边界也就是要找的倒数n个节点。
-
ListNode* removeNthFromEnd(ListNode* head, int n) {
-
ListNode* vhead = new ListNode(0);
-
vhead->next = head;
-
ListNode* fhead = vhead;
-
ListNode* lhead = vhead;
-
while(n-- && fhead != NULL){
-
fhead = fhead->next;
-
}
-
fhead = fhead->next;
-
while(fhead != NULL){
-
fhead = fhead->next;
-
lhead = lhead->next;
-
}
-
lhead->next = lhead->next->next;
-
-
-
return vhead->next;
-
}
160.链表相交
通过计算两个链表的长度,并算出差值n,则可让他们从同时倒数第n个节点同时往后遍历,这样一定能够同时到达交叉的节点。
-
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
-
-
//1、先算出两个链表的长度 lenA lenB,得出它的差值n
-
ListNode * pheadA = headA;
-
ListNode * pheadB = headB;
-
int lenA = 0;
-
int lenB = 0;
-
-
while(pheadA != NULL){
-
pheadA = pheadA->next;
-
lenA ;
-
}
-
-
while(pheadB != NULL){
-
pheadB = pheadB->next;
-
lenB ;
-
}
-
-
pheadA = headA;
-
pheadB = headB;
-
-
int n = 0;
-
if(lenA >= lenB){
-
n = lenA - lenB;
-
while(n--){
-
pheadA = pheadA->next;
-
}
-
-
}
-
else
-
{
-
n = lenB- lenA;
-
while(n--){
-
pheadB = pheadB->next;
-
}
-
}
-
-
-
//2、使得他们从距离尾节点相同距离的n个节点开始往后遍历,直到到达互相包含的节点
-
-
while(pheadA != NULL){
-
if(pheadA == pheadB) return pheadA;
-
pheadA = pheadA->next;
-
pheadB = pheadB->next;
-
}
-
-
return NULL;
-
-
-
-
}
142.环形链表II
一个快指针一次走两步,一个慢指针一次走一步,如果不会走到NULL,且他们相遇,那么就证明有环。
如果有环,则可以让一个从首节点出发,一个从相遇节点出发,他们会在入口节点相遇。
由下可以得出x等于若干圈环加上一个z,所以他们一定会在入口节点相遇。
-
ListNode *detectCycle(ListNode *head) {
-
ListNode* Fhead = head;
-
ListNode* Lhead = head;
-
-
while(Fhead!=NULL && Fhead->next != NULL){
-
Fhead = Fhead->next->next;
-
Lhead = Lhead->next;
-
if(Fhead == Lhead){
-
ListNode* index1 = Fhead;
-
ListNode* index2 = head;
-
while(index1 != index2){
-
index1 = index1->next;
-
index2 = index2->next;
-
}
-
return index1;
-
-
}
-
-
}
-
-
return NULL;
-
-
-
-
}
dd
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgkieai
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13