面试题(1)顺序表链表

xiaoxiao2021-07-04  223

1.删除链表中等于给定值 val 的所有节点。

https://leetcode-cn.com/problems/remove-linked-list-elements/description/

/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* removeElements(struct ListNode* head, int val) { if(head==NULL) return head; struct ListNode *cur=head->next; struct ListNode *prev=head; while(cur) { if(cur->val==val) { prev->next=cur->next; free(cur); cur=prev->next; } else { prev=cur; cur=cur->next; } } if(head->val==val) return head->next; else return head; }

2.反转一个单链表。

https://leetcode-cn.com/problems/reverse-linked-list/description/

创建一个新的结点,重新穿起来

/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* reverseList(struct ListNode* head) { struct ListNode *newHead=NULL; struct ListNode *cur=head; while(cur) { struct ListNode *next=cur->next; cur->next=newHead; newHead=cur; cur=next; } return newHead; }

利用3个指针

/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* reverseList(struct ListNode* head) { struct ListNode *n1,*n2,*n3; if(head==NULL) return NULL; if(head->next==NULL) return head; n1=head; n2=n1->next; n3=n2->next; n1->next=NULL; while(n2) { n2->next=n1; n1=n2; n2=n3; if(n3) n3=n3->next; } return n1; }

3.给定一个带有头结点 head 的非空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

https://leetcode-cn.com/problems/middle-of-the-linked-list/description/

/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* middleNode(struct ListNode* head) { struct ListNode *slow,*fast; slow=head; fast=slow; while(fast!=NULL && fast->next!=NULL) { slow=slow->next; fast=fast->next->next; } return slow; }

4.输入一个链表,输出该链表中倒数第k个结点。

https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&&tqId=11167&rp=2&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { ListNode *slow=pListHead; ListNode *fast=pListHead; unsigned int i=0; for(i=0;i<k;i++) { if(fast==NULL) { return NULL; } fast=fast->next; } while(fast) { fast=fast->next; slow=slow->next; } return slow; } };

5.将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

https://leetcode-cn.com/problems/merge-two-sorted-lists/description/

创建一个节点连接在它后面

/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) { struct ListNode *head,*tail; if(l1==NULL) return l2; else if(l2==NULL) return l1; head=(struct ListNode *)malloc(sizeof(struct ListNode)); tail=head; while(l1 && l2) { if(l1->val < l2->val) { tail->next=l1; l1=l1->next; } else { tail->next=l2; l2=l2->next; } tail=tail->next; } tail->next=l1?l1:l2; return head->next; }

找出第一个最小的数最为头结点

/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) { struct ListNode *head,*tail; if(l1==NULL) return l2; else if(l2==NULL) return l1; if(l1->val<l2->val) { head=l1; l1=l1->next; } else { head=l2; l2=l2->next; } tail=head; while(l1 && l2) { if(l1->val < l2->val) { tail->next=l1; l1=l1->next; } else { tail->next=l2; l2=l2->next; } tail=tail->next; } tail->next=l1?l1:l2; return head; }

6编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前

给定一个链表的头指针ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。

https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70?tpId=8&&tqId=11004&rp=2&ru=/activity/oj&qru=/ta/cracking-the-coding-interview/question-ranking

/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {} };*/ class Partition { public: ListNode* partition(ListNode* pHead, int x) { struct ListNode *less,*lTail; struct ListNode *greater,*gTail; less=(struct ListNode *)malloc(sizeof(struct ListNode)); lTail=less; greater=(struct ListNode *)malloc(sizeof(struct ListNode)); gTail=greater; struct ListNode *cur=pHead; while(cur) { if(cur->val<x) { lTail->next=cur; lTail=lTail->next; } else { gTail->next=cur; gTail=gTail->next; } cur=cur->next; } gTail->next=NULL; lTail->next=greater->next; pHead=less->next; free(less); less=NULL; free(greater); greater=NULL; return pHead; } };

9.编写一个程序,找到两个单链表相交的起始节点。

https://leetcode-cn.com/problems/intersection-of-two-linked-lists/description/

暴力求解

/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) { struct ListNode *curA,*curB; curA=headA; while(curA) { curB=headB; while(curB) { if(curB==curA) { return curA; } curB=curB->next; } curA=curA->next; } return NULL; }

有效解法

/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) { struct ListNode *curA,*curB; int lenA = 0,lenB = 0; curA=headA; curB=headB; while(curA) { lenA++; curA=curA->next; } while(curB) { lenB++; curB=curB->next; } int gap=abs(lenA-lenB); struct ListNode *longList=(lenA>lenB)?headA:headB; struct ListNode *shortList=(lenA>lenB)?headB:headA; while(gap--) { longList=longList->next; } while(longList&&shortList) { if(longList==shortList) { return longList; } longList=longList->next; shortList=shortList->next; } return NULL; }

10.给定一个链表,判断链表中是否有环。

https://leetcode-cn.com/problems/linked-list-cycle/description/

/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ bool hasCycle(struct ListNode *head) { struct ListNode *slow,*fast; slow=head; fast=slow; while(fast!=NULL&& fast->next!=NULL) { slow=slow->next; fast=fast->next->next; if(slow==fast) return true; } return false; }

11.给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

https://leetcode-cn.com/problems/linked-list-cycle-ii/description/

/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */ struct ListNode *detectCycle(struct ListNode *head) { struct ListNode *slow,*fast; slow=head; fast=slow; while(fast!=NULL&& fast->next!=NULL) { slow=slow->next; fast=fast->next->next; if(slow==fast) { slow=head; while(slow!=fast) { slow=slow->next; fast=fast->next; } return slow; } } return NULL; }
转载请注明原文地址: https://www.6miu.com/read-4821318.html

最新回复(0)