ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

链表应用题

2022-08-20 20:00:19  阅读:179  来源: 互联网

标签:pre node head ListNode 应用题 next 链表 NULL


1. 递归删除指定值(无头结点)

void Del(ListNode* L,int val){
    ListNode* p;//指向被删除节点
    if(L==NULL) return;//递归边界
    if(L->val==val){//处理首指针
        p = L;
        L = L->next;
        free(p);//删除节点
        Del(L,val);//递归调用
    }
    else Del(L->next,val);//递归调用
}

2. 循环删除指定值(有头结点)

void Del(ListNode* L,int val){
    ListNode* p = L->next;//遍历节点
    ListNode* pre = L;//辅助删除节点
    ListNode* q;//删除节点
    while(p!=NULL){//遍历节点存在
        if(p->val==val){//找到指定值,更改指针结构
            q = p;
            p = p->next;
            pre->next = p;
            free(q);
        }
        else{
            pre = p;
            p = p->next;
        }
    }
}

3. 反向输出每个值(有头结点)

//主函数从头结点下一个节点调用函数
void rprint(ListNode* L){
    if(L->next) rprint(L->next);//入栈
    print(L->val);
}

4. 删除最小值(有头结点)

void del_min(ListNode* L){
    ListNode* pre = L;  ListNode* p = pre->next;
    ListNode* minpre = pre; ListNode* minp = p;
    while(p){
        if(p->val<minp->val){
            minp = p;
            minpre = pre;
        }
        pre = p;
        p = p->next;
    }
    minpre->next = minp->next;
    free(minp);
}

5. 就地逆置(有头结点)

ListNode* reverseList(ListNode* head) {
    ListNode*pre= head;
    head = head->next;
    ListNode*node;//插入节点
    while(head){
        node = head;
        head = head->next;
        node->next = pre->next;
        pre->next = node;
    }
    return pre;

6. 递增有序(有头结点)

void sort(ListNode* head){
    ListNode* p = head->next;//遍历节点
    head->next = NULL;//断链
    ListNode* node;//插入节点
    while(p){
        node = p;
        p = p->next;
        insert(head,node);//插入重构链表
    }
}

void insert(ListNode* pre,ListNode* node){//将node插入到头结点为pre的链表中
    while(pre->next&&pre->next->val<node->val)
        pre = pre->next;//找到插入位置的前驱
    node->next = pre->next;
    pre->next = node;
}

7. 删除指定范围值(与题2基本一致)

8. 求两链表公共节点(相交链表)

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    if (headA == NULL || headB == NULL)
        return NULL;
    ListNode *pA = headA, *pB = headB;
    while (pA != pB) {
        pA = pA == NULL ? headB : pA->next;
        pB = pB == NULL ? headA : pB->next;
    }
    return pA;
}

9. 递增输出并释放(循环调用题4函数)

10. 按奇偶拆分

ListNode * split(ListNode *A){
    int i =0;//判断序号
    ListNode * B = new ListNode();
    ListNode * ra = A, rb = B;//链表遍历指针
    ListNode *p = A->next;//拆分A的遍历指针
    while(p){//每次处理一个元素
        i++;
        if(i%2==0) rb->next=p,rb=p;//更改下条件可以用来处理奇数偶数
        else ra->next=p,ra=p;
        p = p->next;
    }
    ra->next = NULL;
    rb->next = NULL;
    return B;
}

标签:pre,node,head,ListNode,应用题,next,链表,NULL
来源: https://www.cnblogs.com/929code/p/16608493.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有