IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 算法练习-简单链表 -> 正文阅读

[数据结构与算法]算法练习-简单链表

无头链表创建

#include <stdio.h>
#include <stdlib.h>

typedef struct node //链表
{
	 int val; //数据域
	 struct node *next; //指针域
} Node;

Node *creatTail(Node **head) //尾插法创建链表
{
	 int val;
	 Node *p = *head;
	Node *q = NULL;
	while (1)
	 {
		 scanf("%d", &val);
		if (val == -1)
		 {
			break;
		}
		 q = (Node *)malloc(sizeof(Node));
		 q->val = val;
		if (*head == NULL)
		 {
		 *head = q;
			 p = q;
	 }
	 else
	 {
	 p->next = q;
	 p = p->next;
	}
	 }
	 p->next = NULL;
}

Node* resetlist(Node* head) {
    Node* p = head, *q = NULL;
    while (p != NULL) {
        Node* t = p->next;
        p->next = q;
        q = p;
        p = t;
    }
    return q;
}

void printList(Node *head) //链表遍历
{
	Node *p = head;
	 while (p)
	 {
		printf("%d", p->val);
		 p = p->next;
	 }
}

int main()
{
	Node *head = NULL; //链表
	creatTail(&head); //头插法创建链表
	printList(resetlist(head));  //链表的表达
	return 0;
}

链表逆置

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
    int date;
    struct node* next;
}Node;
Node* creatlist(Node **head){
	Node* p=*head;
	int n;
	Node* q=NULL;
	while(1){
		scanf("%d",&n);
		if(n==-1){
			break;
		}
		q=(Node*)malloc(sizeof(Node));
		q->date=n;
		if(*head==NULL){
			*head=q;
			p=q;
		}
		else{
			p->next=q;
			p=p->next;
		}
	}
	p->next=NULL;
	
}

Node* resetlist(Node* head) {//三指针原地逆置
    Node* p = head, *q = NULL;
    while (p != NULL) {
        Node* t = p->next;
        p->next = q;
        q = p;
        p = t;
    }
    return q;
}
void outPut(Node* head) {
    Node* p = head;
    while (p!= NULL) 
    {
        printf("%2d", p->date);
        p = p->next;
    }
}

int main() {
	Node* head=NULL;
    creatlist(&head);
    outPut(resetlist(head));
    return 0;
}

合并两个有序链表(无头)

要注意空链表的合并

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
    int date;
    struct node* next;
}Node;
Node* creatlist(Node **head){//注意链表创建
	Node* p=*head;
	int  n;
	Node* q=NULL;
	scanf("%d",&n);
	if(n==0){
		return NULL;//如果输入0直接返回NULL
	}
	else{
		q=(Node*)malloc(sizeof(Node));//如果非0,将第一个数和后面连起来
		q->date=n;
		if(*head==NULL){
			*head=q;
			p=q;
		}
		else{
			p->next=q;
			p=p->next;
		}
	while(1){
		scanf("%d",&n);
		if(n==0){
			break;
		}
		q=(Node*)malloc(sizeof(Node));
		q->date=n;
		if(*head==NULL){
			*head=q;
			p=q;
		}
		else{
			p->next=q;
			p=p->next;
		}
	}
	p->next=NULL;
	
	}
	
}

Node* conlist(Node* node1,Node* node2){
	if(node1==NULL){//判断是否为空,如果一个为空,输出另一个,都为空则输出NULL
		return node2;
	}
	else if(node2==NULL){
		return node1;
	}
	else if(node1==NULL&&node2==NULL){
		return NULL;
	}
	else{
	Node* newhead;
	Node* p;
	Node* q;
	newhead=node1->date>node2->date?node2:node1;
	if(newhead==node1){
		
	p =node1->next;
	q=node2;
	}
	else{
		
	p=node1;
	q=node2->next;
	}
	Node* temp=newhead;
	while(p||q){
		if(p&&q==NULL){
			temp->next=p;
			p=p->next;
		}
		else if(q&&p==NULL){
			temp->next=q;
			q=q->next;
		}
		else if(p->date>q->date){
			temp->next=q;
			q=q->next;
		}
		else{
			temp->next=p;
			p=p->next;
		}
			temp=temp->next;
	}
	return newhead;
	}
}

void outPut(Node* head) {
    Node* p = head;
    while (p!= NULL) 
    {
        printf("%2d", p->date);
        p = p->next;
    }
}

int main() {
	Node* head1=NULL;
	Node* head2=NULL;
    creatlist(&head1);
    creatlist(&head2);
    outPut(conlist(head1,head2));
    return 0;
}

删除链表的倒数第N个结点(无头)

方法:快慢指针

#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
    int date;
    struct node* next;
}Node;

Node* creatlist(Node **head){
	Node* p=*head;
	int n;
	Node* q=NULL;
	while(1){
		scanf("%d",&n);
		if(n==0){
			break;
		}
		q=(Node*)malloc(sizeof(Node));
		q->date=n;
		if(*head==NULL){
			*head=q;
			p=q;
		}
		else{
			p->next=q;
			p=p->next;
		}
	}
	p->next=NULL;
	
}

void clist(Node* head,int n){
	Node* q=head;
	Node* p=head;
	for(int x=0;x!=n;x++){//快指针向后指,结果是离慢指针距离为n
		p=p->next;
	}
	while(p->next){//两个指针一起移动,移速一样,到p->next为空,找到要删除节点的位置
		p=p->next;
		q=q->next;
	}
	q->next=q->next->next;//删除
}

void outPut(Node* head) {
    Node* p = head;
    while (p!= NULL) 
    {
        printf("%6d", p->date);
        p = p->next;
    }
}

int main() {
	Node* head=NULL;
	creatlist(&head);
	clist(head,3);
	outPut(head);
    return 0;
}

两两交换链表中的结点(无头)

struct ListNode* swapPairs(struct ListNode* head) {
    struct ListNode dummyHead;
    dummyHead.next = head;
    struct ListNode* temp = &dummyHead;
    while (temp->next != NULL && temp->next->next != NULL) {
        struct ListNode* node1 = temp->next;
        struct ListNode* node2 = temp->next->next;
        temp->next = node2;
        node1->next = node2->next;
        node2->next = node1;
        temp = node1;
    }
    return dummyHead.next;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-14 10:09:04  更:2022-05-14 10:10:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:29:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码