leetcode以及牛客网单链表相关的题、移除链表元素、链表的中间节点、合并两个有序链表、反转链表、链表分割、倒数第k个节点等的介绍

本文主要是介绍leetcode以及牛客网单链表相关的题、移除链表元素、链表的中间节点、合并两个有序链表、反转链表、链表分割、倒数第k个节点等的介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、移除链表元素
  • 二、链表的中间节点
  • 三、合并两个有序链表
  • 四、反转链表
  • 五、链表分割
  • 六、倒数第k个节点
  • 总结


前言

leetcode以及牛客网单链表相关的题、移除链表元素、链表的中间节点、合并两个有序链表、反转链表、链表分割、倒数第k个节点等的介绍


一、移除链表元素

在这里插入图片描述


/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val) {ListNode* newhead = NULL;ListNode* newtail = NULL;ListNode* cur = head;while(cur){if(cur->val != val){if(newhead == NULL){newhead = newtail = cur;}else{newtail->next = cur;newtail = newtail->next;}cur = cur->next;}else{ListNode* next = cur->next;free(cur);cur = next;}}if(newtail)newtail->next = NULL;return newhead;
}
  • 遍历链表,若节点的值不等于给定的值,则尾插到新链表后面。
  • 若等于,则跳过。

二、链表的中间节点

在这里插入图片描述


/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {ListNode* fast = head, *slow = head;while(fast != NULL && fast->next != NULL){fast = fast->next->next;slow = slow->next;}return slow;}
  • 快慢指针
  • 快指针一次走两步。
  • 慢指针一次走一步。
  • 当快指针节点为空或者下一个节点为空时,跳出循环。
  • 此时慢指针指向中间节点。

三、合并两个有序链表

在这里插入图片描述


/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {if(list1 == NULL &&list2 == NULL){return NULL;}ListNode* newHead , *newTail;newHead = newTail = NULL;while(list1 != NULL && list2 != NULL){if(list1->val > list2->val){if(newHead == NULL){newHead = newTail = list2;}else{newTail->next = list2;newTail = newTail->next;}list2 = list2->next;}else{if(newHead == NULL){newHead = newTail = list1;}else{newTail->next = list1;newTail = newTail->next;}list1 = list1->next;}}if(list1 == NULL){if(newHead == NULL)newHead = list2;elsenewTail->next = list2;}else{if(newHead == NULL)newHead = list1;elsenewTail->next = list1;}return newHead;
}
  • 遍历两个单链表。
  • 两个链表都不为空,判断节点大小,将小点节点尾插到新的头节点上。
  • 若有一个链表为空,跳出循环,并将另一个链表尾插到新的尾节点上。

四、反转链表

在这里插入图片描述


/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head) {if(head == NULL)return NULL;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;
}
    1. 将每个节点的next指向前一个节点。
    1. 创建一个新的头节点,遍历链表进行头插。

五、链表分割

在这里插入图片描述


/*
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* gGuard, *gTail, *lGuard, *lTail;gGuard = gTail = (struct ListNode*)malloc(sizeof(struct ListNode));lGuard = lTail = (struct ListNode*)malloc(sizeof(struct ListNode));gGuard->next = lGuard->next = NULL;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;}lTail->next = gGuard->next;gTail->next = NULL;pHead = lGuard->next;free(gGuard);free(lGuard);return pHead;}
};
  • 创建两个带有哨兵位的单向链表。
  • 若小于给定值尾插到小的链表中。
  • 若大于等于给定值尾插到大的链表中。
  • 再将小链表的尾节点的next指向大链表的第一个有效节点。
  • 最后再将大链表的尾节点的next指向NULL。

六、倒数第k个节点

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

#include <stdio.h>
#include <stdlib.h>typedef struct ListNode
{int val;struct ListNode* next;
}ListNode;ListNode* FindKthToTail(ListNode* pListHead, int k)
{if (pListHead == NULL){return NULL;}ListNode* fast, * slow;fast = slow = pListHead;int i = 0;for (i = 1; i < k; i++){fast = fast->next;if (fast == NULL){return NULL;}}while (fast->next != NULL){fast = fast->next;slow = slow->next;}return slow;
}int main()
{ListNode* phead = (ListNode*)malloc(sizeof(ListNode));ListNode* n2 = (ListNode*)malloc(sizeof(ListNode));ListNode* n3 = (ListNode*)malloc(sizeof(ListNode));ListNode* n4 = (ListNode*)malloc(sizeof(ListNode));ListNode* n5 = (ListNode*)malloc(sizeof(ListNode));phead->val = 1;n2->val = 2;n3->val = 3;n4->val = 4;n5->val = 5;phead->next = n2;n2->next = n3;n3->next = n4;n4->next = n5;n5->next = NULL;ListNode* plist = phead;ListNode* ret = FindKthToTail(plist,5);while (ret){printf("%d->", ret->val);ret = ret->next;}printf("NULL\n");return 0;
}
  • 倒数第k个和倒数第一个之间的距离是k-1.
  • 所以使用快慢指针,将快的指针先走k-1步,此时快慢指针差距是k-1.
  • 所以当快指针走到链表结尾时,慢指针走到倒数第k个节点。

总结

leetcode以及牛客网单链表相关的题、移除链表元素、链表的中间节点、合并两个有序链表、反转链表、链表分割、倒数第k个节点等的介绍

这篇关于leetcode以及牛客网单链表相关的题、移除链表元素、链表的中间节点、合并两个有序链表、反转链表、链表分割、倒数第k个节点等的介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/996891

相关文章

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

MySQL进行分片合并的实现步骤

《MySQL进行分片合并的实现步骤》分片合并是指在分布式数据库系统中,将不同分片上的查询结果进行整合,以获得完整的查询结果,下面就来具体介绍一下,感兴趣的可以了解一下... 目录环境准备项目依赖数据源配置分片上下文分片查询和合并代码实现1. 查询单条记录2. 跨分片查询和合并测试结论分片合并(Shardin

基于Python实现进阶版PDF合并/拆分工具

《基于Python实现进阶版PDF合并/拆分工具》在数字化时代,PDF文件已成为日常工作和学习中不可或缺的一部分,本文将详细介绍一款简单易用的PDF工具,帮助用户轻松完成PDF文件的合并与拆分操作... 目录工具概述环境准备界面说明合并PDF文件拆分PDF文件高级技巧常见问题完整源代码总结在数字化时代,PD

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

把Python列表中的元素移动到开头的三种方法

《把Python列表中的元素移动到开头的三种方法》在Python编程中,我们经常需要对列表(list)进行操作,有时,我们希望将列表中的某个元素移动到最前面,使其成为第一项,本文给大家介绍了把Pyth... 目录一、查找删除插入法1. 找到元素的索引2. 移除元素3. 插入到列表开头二、使用列表切片(Lis

pandas数据的合并concat()和merge()方式

《pandas数据的合并concat()和merge()方式》Pandas中concat沿轴合并数据框(行或列),merge基于键连接(内/外/左/右),concat用于纵向或横向拼接,merge用于... 目录concat() 轴向连接合并(1) join='outer',axis=0(2)join='o