0


链表OJ题

文章目录

1. 链表的回文结构

链表的回文结构

因为单链表不能从后往前找节点,所以我们先找到中间节点,然后逆置,最后进行比较。

#include<stdio.h>#include<stdbool.h>typedefstructListNode{int val;structListNode* next;}ListNode;structListNode*middleNode(structListNode* head){
    ListNode* slow,* fast;
    slow = fast = head;while(fast && fast->next){
        slow = slow->next;
        fast = fast->next->next;}return slow;}structListNode*reverseList(structListNode* head){if(NULL== head){return head;}

    ListNode* n1,* n2,* n3;
    n1 =NULL, n2 = head, n3 = head->next;while(n2){
        n2->next = n1;
        n1 = n2;
        n2 = n3;if(n3){
            n3 = n3->next;}}return n1;}

bool chkPalindrome(ListNode* A){
    ListNode* mid =middleNode(A);
    ListNode* rmid =reverseList(mid);while(A && rmid){if(A->val != rmid->val){return false;}

        A = A->next;
        rmid = rmid->next;}return true;}

2. 相交链表

相交链表

#include<stdio.h>#include<stdlib.h>structListNode{int val;structListNode* next;};structListNode*getIntersectionNode(structListNode* headA,structListNode* headB){structListNode* curA = headA;structListNode* curB = headB;int lenA =0;while(curA->next){++lenA;
        curA = curA->next;}int lenB =0;while(curB->next){++lenB;
        curB = curB->next;}//不相交if(curA != curB){returnNULL;}int gap =abs(lenA - lenB);//因为我们不知道A长还是B长,所以我们要用假设法,先假设A长,如果不对,再调换一下就行structListNode* longList = headA;structListNode* shortList = headB;if(lenB > lenA){
        longList = headB;
        shortList = headA;}//让长的先走gap步while(gap--){
        longList = longList->next;}//再同时走,找交点while(longList != shortList){
        longList = longList->next;
        shortList = shortList->next;}return longList;}

3. 链表中倒数第k个结点

链表中倒数第k个结点
思路2:

#include<stdio.h>structListNode{int val;structListNoe* next;};structListNode*FindKthToTail(structListNode* pListHead,int k){structListNode* slow = pListHead,* fast = pListHead;//fast先走k步while(k--){//k还没有减到0,链表已经空了,说明k大于链表的长度if(NULL== fast){returnNULL;}

        fast = fast->next;}//slow和fast同时走,fast走到空,slow就是倒数第k个while(fast){
        slow = slow->next;
        fast = fast->next;}return slow;}

4. 环形链表

环形链表(1)
环形链表(2)

#include<stdbool.h>structListNode{int val;structListNode* next;};
 

bool hasCycle(structListNode* head){structListNode* slow = head,* fast = head;while(fast && fast->next){
        slow = slow->next;
        fast = fast->next->next;if(slow == fast){return true;}}return false;}

5. 环形链表 II

找入环点:
环形链表 II
法一:

#include<stdio.h>structListNode{int val;structListNode* next;};structListNode*detectCycle(structListNode* head){structListNode* slow = head,* fast = head;while(fast && fast->next){
        slow = slow->next;
        fast = fast->next->next;if(slow == fast){structListNode* meet = slow;while(meet != head){
                meet = meet->next;
                head = head->next;}return meet;}}returnNULL;}

法二:

#include<stdio.h>#include<stdlib.h>structListNode{int val;structListNode* next;};structListNode*getIntersectionNode(structListNode* headA,structListNode* headB){structListNode* curA = headA;structListNode* curB = headB;int lenA =0;while(curA->next){++lenA;
        curA = curA->next;}int lenB =0;while(curB->next){++lenB;
        curB = curB->next;}//不相交if(curA != curB){returnNULL;}int gap =abs(lenA - lenB);structListNode* longList = headA;structListNode* shortList = headB;if(lenB > lenA){
        longList = headB;
        shortList = headA;}//让长的先走gap步while(gap--){
        longList = longList->next;}//再同时走,找交点while(longList != shortList){
        longList = longList->next;
        shortList = shortList->next;}return longList;}structListNode*detectCycle(structListNode* head){structListNode* slow = head,* fast = head;while(fast && fast->next){
        slow = slow->next;
        fast = fast->next->next;if(slow == fast){structListNode* meet = slow;structListNode* headx = meet->next;
            meet->next =NULL;returngetIntersectionNode(head, headx);}}returnNULL;}

6. 随机链表的复制

随机链表的复制
写代码的时候建议一边画细图,一边写:
随机链表的复制细图

#include<stdio.h>#include<stdlib.h>structNode{int val;structNode*next;structNode*random;};structNode*copyRandomList(structNode* head){structNode* cur = head;//拷贝节点插入原节点的后面while(cur){structNode* copy =(structNode*)malloc(sizeof(structNode));
        copy->val = cur->val;//插入
        copy->next = cur->next;
        cur->next = copy;//迭代
        cur = cur->next->next;}//控制拷贝节点的random
    cur = head;while(cur){structNode* copy = cur->next;if(NULL== cur->random){
            copy->random =NULL;}else{
            copy->random = cur->random->next;}//迭代
        cur = cur->next->next;}//把copy节点解下来,链接成新链表structNode* copyhead =NULL,* tail =NULL;
    cur = head;while(cur){structNode* copy = cur->next;structNode* next = copy->next;//尾插if(NULL== tail){
            copyhead = tail = copy;}else{
            tail->next = copy;
            tail = tail->next;}

        cur->next = next;
        cur = next;}return copyhead;}

本文转载自: https://blog.csdn.net/weixin_73077334/article/details/138978774
版权归原作者 waves浪游 所有, 如有侵权,请联系我们删除。

“链表OJ题”的评论:

还没有评论