本题要求交换前后节点,我使用了三个指针,在交换过程中要分类讨论前驱结点和后继结点是否为空的情况。
具体代码如下:
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode*p=new ListNode(0);
p->next=head;
ListNode*q=p;
ListNode*pre=head;
if(pre==NULL)
{
return head;
}
ListNode*nex=head->next;
while(pre!=NULL&&nex!=NULL)
{
pre->next=nex->next;
nex->next=pre;
q->next=nex;
q=q->next->next;
if(pre->next==NULL)
{
break;
}
else
{
pre=pre->next;
nex=pre->next;
}
}
return p->next;
}
};
本题要求删除倒数第n个结点,首先计算出链表的长度确定删除结点的位置,而后通过循环将指针移动到删除结点的前驱结点处,而后通过链表中删除结点的操作将倒数第n个结点删除。
具体代码如下:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode*p=new ListNode(0);
p->next=head;
ListNode*q=head;
int len=0;
while(q!=NULL)
{
q=q->next;
len++;
}
int length=len-n;
if(length==0)
{
}
int m=0;
ListNode*a=p;
while(m<length)
{
a=a->next;
m++;
}
ListNode*b=a->next;
a->next=b->next;
delete b;
return p->next;
}
};
本题要求出链表相交的第一个结点,可以采用链表尾部对齐的方式,从较短链表的头结点和对应长链表的头结点开始遍历对比,如果有结点相同则返回该结点否则返回NULL,这里需要理解第一个相交结点后面的长度相同,要注意结点val值相同不意味着指向同一个结点。
具体代码如下:
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode*a=headA;
int n=0;
while(a!=NULL)
{
a=a->next;
n++;
}
ListNode*b=headB;
int m=0;
while(b!=NULL)
{
b=b->next;
m++;
}
int s=0;
if(m>=n)
{
s=m-n;
while(s>0)
{
headB=headB->next;
s--;
}
}
else
{
s=n-m;
while(s>0)
{
headA=headA->next;
s--;
}
}
while(headA!=NULL&&headB!=NULL)
{
if(headA==headB)
{
return headA;
}
headA=headA->next;
headB=headB->next;
}
return NULL;
}
};
本题要求出链表中成环的第一个结点,可以采用快慢指针法,循环中慢指针移动一步,快指针移动两步。如果成环,在环内快指针每次循环向慢指针靠近一步,则在慢指针进入环的第一圈便与快指针相遇。设头结点到相交结点的长度为x,相交结点到相遇结点长度为y,成环剩余长度为z,可知快指针走的步数为x+n(y+z)+y,慢指针走的步数为x+y,由于快指针的步数为慢指针的两倍,故x=n(y+z)-y,即x=(n-1)(y+z)+z。由上述推导可知两指针相遇时x=z,故可从相遇结点和头结点开始遍历,遇到的相同结点即为所求。
具体代码如下:
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
ListNode*fast=head;
ListNode*slow=head;
while(fast!=NULL&&fast->next!=NULL)
{
fast=fast->next->next;
slow=slow->next;
if(slow==fast)
{
ListNode*index=head;
while(index!=slow)
{
index=index->next;
slow=slow->next;
}
return index;
}
}
return NULL;
}
};
376

被折叠的 条评论
为什么被折叠?



