24. 两两交换链表中的节点
题目链接/文章讲解/视频讲解: 代码随想录
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode *ad=new ListNode(0);
ad->next=head;
ListNode*cur=ad;
while(cur->next!=nullptr&&cur->next->next!=nullptr)
{
ListNode*tmp=cur->next;
ListNode*tmp1=cur->next->next;
cur->next=tmp1;
tmp->next=tmp1->next;
tmp1->next=tmp;
cur=cur->next->next;
}
ListNode*head1=ad->next;
return head1;
}
};
其实这个题目用虚拟头结点会好做很多,这里因为是俩俩交换所以这里用了三个指针,其实用俩个也可以就是next会写很多,会容易出错,建议还是拿纸和笔模拟一下指针是怎么变的会好懂很多
19.删除链表的倒数第N个节点
题目链接/文章讲解/视频讲解:
代码随想录
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* slow = dummyHead;
ListNode* fast = dummyHead;
while(n-- && fast != NULL) {
fast = fast->next;
}
fast = fast->next;
while (fast != NULL) {
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
return dummyHead->next;
}
};
其实就是找规律,找到规律就能写出来
面试题 02.07. 链表相交
题目链接/文章讲解:代码随想录
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* curA = headA;
ListNode* curB = headB;
int lenA = 0, lenB = 0;
while (curA != NULL) {
lenA++;
curA = curA->next;
}
while (curB != NULL) {
lenB++;
curB = curB->next;
}
curA = headA;
curB = headB;
if (lenB > lenA) {
swap (lenA, lenB);
swap (curA, curB);
}
int gap = lenA - lenB;
while (gap--) {
curA = curA->next;
}
while (curA != NULL) {
if (curA == curB) {
return curA;
}
curA = curA->next;
curB = curB->next;
}
return NULL;
}
};
其实这道题需要考虑的是比较以及什么时候比较,首先先将两个链表的长度算出来交的,之后我们算出两个链表的长度差,之后需要根据长度差,对长的链表先进行移动(在假设相同的情况下,两个链表的后部分是完全相同的所以就先将长链表进行移动,之后再对两个链表进行比较就行)
142.环形链表II
题目链接/文章讲解/视频讲解:代码随想录
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode* fast = head;
ListNode* slow = head;
while(fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast) {
ListNode* index1 = fast;
ListNode* index2 = head;
while (index1 != index2) {
index1 = index1->next;
index2 = index2->next;
}
return index2;
}
}
return NULL;
}
};
}
};
其实也是找规律,建议还是自己拿笔和纸模拟一下运行过程