1、24T
又有空指针有死循环的错误。循环出口没搞清楚,应该是下一个和下下一个都不空才行,也就是p指向的后两个是要交换的,后面只有一个元素或者没有都退出循环。可以有2个临时指针也可以只有一个指向第一个要交换的结点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
if(head==nullptr)
{
return nullptr;
}
ListNode *L=new ListNode(0,head);
ListNode* p=L;
while(p->next!=nullptr && p->next->next!=nullptr)
{
ListNode* t1=p->next;
p->next=t1->next;
t1->next=p->next->next;
p->next->next=t1;
p=t1;
}
head = L->next;
delete L;
return head;
}
};
2、第9T。注意p和q之间应该相隔n-1个,因为要实现后删
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* L=new ListNode(0,head);
ListNode *p=L;
for(int i=0;i<n&&p!=nullptr;++i)//p指向第n个
{
p=p->next;
}
ListNode *q=L;
while(p->next!=nullptr)
{
q=q->next;
p=p->next;
}
ListNode *pre=q->next;
if(pre)q->next=pre->next;
delete pre;
head=L->next;
delete L;
return head;
}
};
3、面试题02,07,简单但是一定要想好了再敲,一个循环先找到第一个相同的结点,再一个循环判断后面结点是不是都相同。
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *p = headA;
ListNode *q = headB;
int m = 0, n = 0;
while (p) {
p = p->next;
m++;
}
while (q) {
q = q->next;
n++;
}
cout << m << " " << n << endl;
if (m >= n) {
p = headA;
for (int i = 0; i < m - n; ++i) {
p = p->next;
}
q=headB;
} else if (m < n) {
q = headB;
for (int i = 0; i < n - m; ++i) {
q = q->next;
}
p=headA;
}
while(p!=q&&p)
{
p=p->next;
q=q->next;
}
if(!p)return nullptr;
ListNode *r = p;
while(p)
{
if(p!=q)return nullptr;
p=p->next;
q=q->next;
}
return r;
}
};
4、142.环形链表II。判断有没有环:fast指针两步一走,slow指针一步一走。相对速度是1,slow指针每前进一步,fast指针和它之间的距离就减一,所以slow指针前进一圈,fast指针和它的距离会减一圈,初始的时候fast和slow之间的距离最大是一圈,所以在slow在环内走第一圈的时候一定会和fast相遇(是相遇不是前去后继的关系)。找入口点先设了3个变量,根据快慢指针的路程(经过结点数)关系得到x=(n-1)(y+z)+z。新设置一个指针从快慢指针相遇的时候开始走,同时slow也开始走,新指针走x步的时候慢指针就会和它相遇,这个点就是入口点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* L=new ListNode(0,head);
ListNode *p=L;
for(int i=0;i<n&&p!=nullptr;++i)//p指向第n个
{
p=p->next;
}
ListNode *q=L;
while(p->next!=nullptr)
{
q=q->next;
p=p->next;
}
ListNode *pre=q->next;
if(pre)q->next=pre->next;
delete pre;
head=L->next;
delete L;
return head;
}
};