带头或者不带头
循环或者非循环
- #pragma once
- #include
- #include
- #include
-
- typedef int SLTDataType;
- typedef struct SListNode
- {
- SLTDataType data;
- struct SListNode* next;
- }SLTNode;
-
- void SListPrint(SLTNode* phead);
-
- void SListPushBack(SLTDataType** phead, SLTDataType x);
- void SListPushFront(SLTDataType** phead, SLTDataType x);
-
-
- void SListPopBack(SLTNode** pphead);
- void SListPopFront(SLTNode** pphead);
-
- SLTNode* BuySListNode(SLTDataType x);
-
- SLTDataType* SListFind(SLTNode* phead, SLTDataType x);
- void SListModify(SLTNode* phead, SLTDataType x, SLTDataType y);
- void SListFrontPush(SLTNode** pphead, SLTDataType x, SLTDataType y);
- void SListBackPush(SLTNode** pphead, SLTDataType x, SLTDataType y);
-
- void SListPop(SLTNode** pphead, SLTDataType x);
-
- void SListInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);
- void SListErase(SLTNode** pphead, SLTNode* pos);
- #define _CRT_SECURE_NO_WARNINGS 1
- #include
- #include
- #include
- #include"SList.h"
- void SListPrint(SLTNode* phead)
- {
- SLTNode* cur = phead;
- while (cur != NULL)
- {
- printf("%d->", cur->data);
- cur = cur->next;
- }
-
- printf("null\n");
- }
-
-
- void SListPushBack(SLTDataType** pphead, SLTDataType x)
- {
- assert(pphead);
- SLTNode* newnode = BuySListNode(x);
-
- if (*pphead == NULL)
- {
- *pphead = newnode;
- }
- else
- {
- SLTNode* tail = *pphead;
- while (tail->next != NULL)
- {
- tail = tail->next;
- }
- tail->next = newnode;
- }
- }
-
- SLTNode* BuySListNode(SLTDataType x)
- {
- SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
- assert(newnode);
- newnode->data = x;
- newnode->next = NULL;
- return newnode;
- }
- void SListPushFront(SLTDataType** pphead, SLTDataType x)
- {
- assert(pphead);
- SLTNode* newnode = BuySListNode(x);
- newnode->next = *pphead;
- *pphead = newnode;
- }
-
- void SListPopBack(SLTNode** pphead)
- {
- assert(pphead);
-
- assert(*pphead);
- if ((*pphead)->next == NULL)
- {
- free(*pphead);
- *pphead = NULL;
- }
- else
- {
- SLTNode* tail = *pphead;
- /*SLTNode* tailPrev = NULL;
- while (tail->next != NULL)
- {
- tailPrev = tail;
- tail = tail->next;
- }
- free(tail);
- tailPrev->next = NULL;*/
- while (tail->next->next != NULL)
- {
- tail = tail->next;
- }
- free(tail->next);
- tail->next = NULL;
- }
- }
- void SListPopFront(SLTNode** pphead)
- {
- assert(pphead);
- assert(*pphead);
- SLTNode* next = (*pphead)->next;
- free(*pphead);
- *pphead = next;
- }
-
- SLTDataType* SListFind(SLTNode* phead, SLTDataType x)
- {
- SLTNode* cur = phead;
- while (cur)
- {
- if (cur->data == x)
- {
- return cur;
- }
- cur = cur->next;
- }
- return NULL;
- }
- void SListModify(SLTNode* phead, SLTDataType x, SLTDataType y)
- {
- SLTNode* ret = SListFind(phead, x);
- if (ret)
- {
- ret->data = y;
- }
- }
- void SListFrontPush(SLTNode** pphead, SLTDataType x, SLTDataType y)
- {
- assert(pphead);
- assert(*pphead);
- SLTNode* pos = SListFind(*pphead, x);
- if (pos)
- {
- SListInsert(pphead, pos, y);
- }
- }
-
- void SListBackPush(SLTNode** pphead, SLTDataType x, SLTDataType y)
- {
- assert(pphead);
- assert(*pphead);
- SLTNode* pos = SListFind(*pphead, x);
- if (pos)
- {
- if (pos == *pphead)
- {
- SListPushBack(pphead, x);
- }
- else
- {
- SLTNode* newnode = BuySListNode(x);
- newnode->next = pos->next;
- pos->next = newnode;
- newnode->data = y;
- }
- }
- }
-
- void SListPop(SLTNode** pphead, SLTDataType x)
- {
- assert(pphead);
- assert(*pphead);
- SLTNode* pos = SListFind(*pphead, x);
- if (pos)
- {
- SListErase(pphead, pos);
- }
- }
-
- void SListInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
- {
- assert(pos);
- assert(pphead);
- if (pos == *pphead)
- {
- SListPushFront(pphead, x);
- }
- else
- {
- SLTNode* prev = *pphead;
- while (prev->next != pos )
- {
- prev = prev->next;
- }
- SLTNode* newnode = BuySListNode(x);
- prev->next = newnode;
- newnode->next = pos;
- }
- }
- void SListErase(SLTNode** pphead, SLTNode* pos)
- {
- assert(pphead);
- assert(pos);
- if (*pphead == pos)
- {
- SListPopFront(pphead);
- }
- else
- {
- SLTNode* prev = *pphead;
- while (prev->next != pos)
- {
- prev = prev->next;
- }
- prev->next = pos->next;
- free(pos);
- }
- }
- #define _CRT_SECURE_NO_WARNINGS 1
- #include
- #include"SList.h"
- #include
-
- void menu()
- {
- printf("*****************************************************************\n");
- printf("1、尾插 2、头插\n");
- printf("3、尾删 4、头删\n");
- printf("5、前面插 6、后面插\n");
- printf("7、任意删 8、修改\n");
- printf("9、打印 -1、退出\n");
-
- printf("*****************************************************************\n");
-
- }
-
- void TestSList1()
- {
- SLTNode* n1 = NULL;
- /*SLTNode* n1 = (SLTNode*)malloc(sizeof(SLTNode));
- assert(n1);*/
- //SLTNode* n2 = (SLTNode*)malloc(sizeof(SLTNode));
- //assert(n2);
- //SLTNode* n3 = (SLTNode*)malloc(sizeof(SLTNode));
- //assert(n3);
- //SLTNode* n4 = (SLTNode*)malloc(sizeof(SLTNode));
- //assert(n4);
- //n1->data = 1;
- //n2->data = 2;
- //n3->data = 3;
- //n4->data = 4;
- //n1->next = n2;
- //n2->next = n3;
- //n3->next = n4;
- //n4->next = NULL;
- SListPushFront(&n1, 1);
-
- SListPushBack(&n1, 5);
-
- SListPushBack(&n1, 2);
- SListPushFront(&n1, 1);
-
-
-
- SListPrint(n1);
- SLTNode* a = SListFind(n1, 5);
- SListModify(n1, 1, 6);
- SListPrint(n1);
- SListFrontPush(&n1, 1, 2);
-
- SListPrint(n1);
- SListPrint(n1);
-
- }
-
-
- int main()
- {
- SLTNode* n1 = NULL;
- int option;
- do {
- menu();
- if (scanf("%d", &option) == EOF)
- {
- printf("scanf输入错误\n");
- break;
- }
-
- int val, pos;
- switch (option)
- {
- case -1:
- printf("退出\n");
- exit(0);
- break;
- case 1:
- printf("请连续输入你要尾插的数据,以0结束:\n");
- scanf("%d", &val);
- while (val != 0)
- {
- SListPushBack(&n1, val);
- scanf("%d", &val);
- }
- break;
- case 2: {
- printf("请连续输入你要头插的数据,以0结束:\n");
- scanf("%d", &val);
- while (val != 0)
- {
- SListPushFront(&n1, val);
- scanf("%d", &val);
- }
- break;
- }
- case 3:
- SListPopBack(&n1);
- break;
- case 4:
- SListPopFront(&n1);
- break;
- case 5:
- {
- int y;
- int x;
- printf("请输入你要的被插入的,和插入的值\n");
- scanf("%d%d", &x, &y);
- SListFrontPush(&n1, x, y);
- break;
- }
- case 6:
- {
- int y;
- int x;
- printf("请输入你要的被插入的,和插入的值\n");
- scanf("%d%d", &x, &y);
- SListBackPush(&n1, x, y);
- break;
- }
- case 7:
- {
- int x;
- printf("请输入你要删除的值\n");
- scanf("%d", &x);
- SListPop(&n1, x);
- }
- case 8:
- {
- int y;
- int x;
- printf("请输入你要修改的位置,和修改后的值\n");
- scanf("%d%d", &x, &y);
- SListModify(n1, x, y);
- break;
- }
- case 9:
- SListPrint(n1);
- break;
- default:
- exit(-1);
- break;
- }
- } while (option != -1);
- return 0;
- }
【LeetCode】203. 移除链表元素的三种方法_江湖第一深情的博客-CSDN博客
给你一个链表的头节点 head
和一个整数 val
,请你删除链表中所有满足 Node.val == val
的节点,并返回 新的头节点 。
【LeetCode】206. 反转链表—力扣_江湖第一深情的博客-CSDN博客
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
【LeetCode】876. 链表的中间结点—力扣_江湖第一深情的博客-CSDN博客
给定一个头结点为 head
的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
(3条消息) 剑指offer--链表中倒数第k个结点(jz22)_笨笨同学的博客-CSDN博客
输入一个链表,输出该链表中倒数第k个结点。
(3条消息) 【2016校招真题】OR36 链表的回文结构_笨笨同学的博客-CSDN博客
对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。
给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
(3条消息) 【程序员面试宝典】CM11 链表分割_笨笨同学的博客-CSDN博客
现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。
(3条消息) 【LeetCode】21. 合并两个有序链表—力扣_笨笨同学的博客-CSDN博客
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
(3条消息) 【LeetCode】160. 相交链表—力扣_笨笨同学的博客-CSDN博客
给你两个单链表的头节点 headA
和 headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null
。
(3条消息) 【LeetCode】141. 环形链表—力扣_笨笨同学的博客-CSDN博客
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。
(3条消息) 【LeetCode】142. 环形链表 II—力扣_笨笨同学的博客-CSDN博客
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。
(3条消息) 【LeetCode】138. 复制带随机指针的链表—力扣_笨笨同学的博客-CSDN博客
给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。
构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。
例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。
返回复制链表的头节点。
用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:
val:一个表示 Node.val 的整数。
random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为 null 。
你的代码 只 接受原链表的头节点 head 作为传入参数。