首页 > 编程语言 >四种语言刷算法之重排链表

四种语言刷算法之重排链表

时间:2023-04-04 20:33:49浏览次数:47  
标签:count head ListNode val int next 链表 算法 重排

力扣143. 重排链表

1、C

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
void reorderList(struct ListNode* head){
    struct ListNode* p = head;
    int count = 0;
    while(p){
        p = p->next;
        count++;
    }
    if(count<3)return;
    p = head;
    for(int i=0;i<(count+1)/2-1;i++){
        p = p->next;
    }
    struct ListNode *q = p->next;
    p->next = NULL;
    p = NULL;
    while(q){
        struct ListNode* r = q->next;
        q->next = p;
        p = q;
        q = r;
    }
    q = head;
    while(p){
        struct ListNode* temp1 = q->next;
        struct ListNode* temp2 = p->next;
        p->next = q->next;
        q->next = p;
        p = temp2;
        q = temp1;
    }
}

2、C++

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    void reorderList(ListNode* head) {
        ListNode *p = head;
        int count = 0;
        while(p!=nullptr){
            p = p->next;
            count++;
        }
        if(count<3)return;
        p = head;
        for(int i=0;i<(count+1)/2-1;i++){
            p = p->next;
        }
        ListNode *q = p->next;
        p->next = nullptr;
        p = nullptr;
        while(q!=nullptr){
            ListNode* r = q->next;
            q->next = p;
            p = q;
            q = r;
        }
        q = head;
        while(p!=nullptr){
            ListNode *temp1 = q->next;
            ListNode *temp2 = p->next;
            p->next = q->next;
            q->next = p;
            p = temp2;
            q = temp1;
        }
    }
};

3、JAVA

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public void reorderList(ListNode head) {
        ListNode p = head;
        int count = 0;
        while(p!=null){
            p = p.next;
            count++;
        }
        if(count<3)return;
        p = head;
        for(int i=0;i<(count+1)/2-1;i++){
            p = p.next;
        }
        ListNode q = p.next;
        p.next = null;
        p = null;
        while(q!=null){
            ListNode r = q.next;
            q.next = p;
            p = q;
            q = r;
        }
        q = head;
        while(p!=null){
            ListNode temp1 = p.next;
            ListNode temp2 = q.next;
            p.next = q.next;
            q.next = p;
            p = temp1;
            q = temp2;
        }
    }
}

4、Python

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution(object):
    def reorderList(self, head):
        """
        :type head: ListNode
        :rtype: None Do not return anything, modify head in-place instead.
        """
        p = head
        count = 0;
        while(p is not None):
            p = p.next
            count += 1
        if(count<3):return;
        p = head
        for i in range((count+1)/2-1):
            p = p.next
        q = p.next
        p.next = None
        p = None
        while(q is not None):
            r = q.next
            q.next = p
            p = q
            q = r
        q = head
        while(p is not None):
            temp1 = q.next
            temp2 = p.next
            p.next = q.next
            q.next = p
            p = temp2
            q = temp1

标签:count,head,ListNode,val,int,next,链表,算法,重排
From: https://www.cnblogs.com/cmkbk/p/17254990.html

相关文章

  • 单向链表和双向链表的逆序的两种实现方式
    单向链表的逆序实现方式publicstaticclassNode{privateintval;privateNodenext;publicNode(intval){this.val=val;}}/**实现单向链表的第一种方式,只通过链表指针的重连来实现*/publicstaticNoderece......
  • 算法问题——动态规划和回溯算法问题
    回溯算法树形问题排列问题组合问题二位平面的回溯算法回溯递归问题树形问题17.电话号码的字母组合(全排列的问题)/***Copyright(C),2018-2020*FileName:letterCombinations*Author:xjl*Date:2020/3/2015:30*Description:给定一个仅包含数字2-9的字......
  • 算法训练——剑指offer(动态规划算法)摘要
    摘要一、动态规划原理与解题方法二、动态规划算法练习题目2.1跳台阶问题package动态规划算法;importorg.junit.Test;/***@ClassnameJZ69跳台阶问题*@DescriptionTODO*@Date2022/2/1118:54*@Createdbyxjl*/publicclassJZ69跳台阶问题{/**......
  • LeetCode——贪心算法总结
    贪心算法的主要的解题目的思路是: 860.柠檬水找零这道题算是生活中很常见的一道题,对于每一个顾客如果我们都有足够的零钱给他找零,那么就返回true,只要有一个顾客没有足够的零钱找给他就返回false。顾客只能有3种纸币,5元,10元,20元。我们要统计5元和10元的数量,20元的不需要统计,因为20......
  • 25. K 个一组翻转链表
    25.K个一组翻转链表给你链表的头节点head,每 k 个节点一组进行翻转,请你返回修改后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。......
  • 最全综述 | 图像分割算法
    图像分割是计算机视觉研究中的一个经典难题,已经成为图像理解领域关注的一个热点,图像分割是图像分析的第一步,是计算机视觉的基础,是图像理解的重要组成部分,同时也是图像处理中最困难的问题之一。所谓图像分割是指根据灰度、彩色、空间纹理、几何形状等特征把图像划分成若干个互不相......
  • 如何基于AI算法实现智慧工厂视频大数据智能预警平台搭建?
    当前我国正处于数字经济高速发展的时代,企业正面临着数字化“转型升级”的需求。那么,工厂该如何实现智能化转型目标呢?EasyCVR视频融合平台与AI智能分析网关,融合了边缘AI智能识别技术,部署了多种AI算法,能实现人脸、人体、车辆、物体、行为等智能检测,在工厂的智慧转型场景中发挥着重要......
  • 合并两个有序链表
    将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例1:输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]示例2:输入:l1=[],l2=[]输出:[]示例3:输入:l1=[],l2=[0]输出:[0]提示:两个链表的节点数目范围是[0,50......
  • 138. 复制带随机指针的链表
    /*//DefinitionforaNode.classNode{public:intval;Node*next;Node*random;Node(int_val){val=_val;next=NULL;random=NULL;}};*/classSolution{public:Node*copyRandomList(Node*......
  • 第三届人工智能,大数据与算法国际学术会议 (CAIBDA 2023)
    第三届人工智能,大数据与算法国际学术会议(CAIBDA2023)​大会官网:http://www.caibda.org/大会时间:2023年6月16-18日大会地点:中国郑州截稿日期:2023年6月10日接受/拒稿通知:投稿后1周内提交检索:EICompendex,Scopus往届检索记录:CAIBDA2021| IEEEXplore | EICompende......