首页 > 其他分享 >链表应用题

链表应用题

时间:2022-08-20 20:00:18浏览次数:64  
标签: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
From: https://www.cnblogs.com/929code/p/16608493.html

相关文章

  • 顺序表应用题
    1.删除返回最小值并由最后元素填补boolDel_Min(vector<int>&nums,int&val){if(nums.size()==0)returnfalse;intpos=0;//假定0号元素最小for(int......
  • go语言 单向链表
    //示例45packagemainimport"fmt"funcmain(){varintlinkLinkfori:=0;i<10;i++{intlink.InsertTail(i)}......
  • Vue面试题05:Vue中如何扩展一个组件(应用题)
    Vue中如何扩展一个组件按照逻辑扩展和内容扩展来列举逻辑扩展的方法:mixins、extends、compositionapi内容扩展的方法:slots使用方法、使用场景和问题混入:mixi......
  • 链表反转类算法题
    反转链表类NO1.反转链表给定一个长度为n的链表,反转该链表,输出表头。方法一:迭代法(推荐使用)算法流程:step1:特殊情况判断,空链表或只有一个结点的链表,直接返回头......
  • 2.JZ24 反转链表
    C++1#include"stdafx.h"2#include<stdlib.h>3structNode{4intdata;5Node*next;6};78voidprint1(Node*head)9{10Node......
  • 剑指offer系列:从尾到头打印链表
    Java实现方式描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。代码/***publicclassListNode{*intval;*ListNodenext=null;*......
  • 分隔链表
    目录题目描述解题思路解题代码题目描述题目地址:https://leetcode.cn/problems/partition-list/题目要求给你一个链表的头节点head和一个特定值x,请你对链表进行分隔,......
  • LeetCode 反转链表算法题解 All In One
    LeetCode反转链表算法题解AllInOnejs/ts实现反转链表反转链表原理图解双指针,swap交换//反转双指针//swap:a=b;c=a;b=c;letprev:List......
  • 删除链表的倒数第 N 个结点
    题目描述题目地址:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/题目要求:给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。解题思路......
  • 合并两个排序的链表
    目录题目描述解题思路解题代码题目描述题目地址:http://mtw.so/6r71s0题目要求:输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的......