目录
题目1:返回倒数第k个结点
代码:
typedef struct ListNode listnode;
int kthToLast(struct ListNode* head, int k){
listnode* slow,*fast;
slow=fast=head;
while(k)
{
fast=fast->next;
k--;
}
while(fast)
{
slow=slow->next;
fast=fast->next;
}
return slow->val;
}
同时,leetcode的测试用例中,并没有k大于链表结点数量的情况,因其保证了k是有效的。若k可能是无效的,在第一个while语句中加入限制条件即可。
题目2:回文链表
在继续本题的讲解之前,请先看本文:单链表leetcode刷题/上(C语言版)
后有大用!!!
图1
图2
代码:
typedef struct ListNode listnode;
struct ListNode* middleNode(struct ListNode* head) {
//快慢指针
listnode* slow,*fast;
//slow每次走一步,fast每次走两步
slow=fast=head;
while(fast&&fast->next)//是否可以反过来写?
{
slow=slow->next;
fast=fast->next->next;
}
return slow;
}
struct ListNode* reverseList(struct ListNode* head) {
if(head==NULL)
{
return NULL; //链表为空
}
else{
listnode* n1,*n2,*n3;
n1=NULL;
n2=head;
n3=head->next;
while(n2)
{
n2->next=n1;
n1=n2;//n1、n2同时往后走
n2=n3;
if(n3)
{
n3=n3->next; //n3往后走
}
}
return n1;//循环结束时,n1恰好指向结果链表的首元结点
}
}
bool isPalindrome(struct ListNode* head){
listnode* mid = middleNode(head);
listnode* rmid = reverseList(mid);
while(head && rmid)
{
if(head->val != rmid->val)
return false;
head=head->next;
rmid=rmid->next;
}
return true;
}
题目3:相交链表
碰到该题可能出现的疑惑:
- 为什么链表的相交只能是Y型状的,不能是X型状的?这是因为链表结点的next只能有一个结点,而X型的next则有两个结点,这已经不算是单链表了,因此不行。
- 两个数值相等的结点为什么有些情况下不算相交?题设里已经明确表明,相交的判断不是通过数值,而是通过结点所指向的内存空间是否是同一块地方。所以判断语句应该是 结点与结点是否相等,而不是结点数值是否与结点数值相等。
代码:
typedef struct ListNode listnode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
listnode* curA,*curB;
curA = headA,curB = headB;
int lenA = 1,lenB = 1;
while(curA->next)
{
curA = curA->next;
lenA++;
}
while(curB->next)
{
curB=curB->next;
lenB++;
}
if(curA != curB)
return NULL;
int gap = abs(lenA - lenB);
listnode* longlist = headA,* shortlist = headB;
if(lenB > lenA)
{
longlist = headB;
shortlist = headA;
}
while(gap--)
{
longlist = longlist -> next;
}
while(longlist != shortlist)
{
longlist = longlist->next;
shortlist = shortlist->next;
}
return shortlist;
}