日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Leetcode链表考察(Python、C语言和java实现)

發布時間:2023/12/29 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode链表考察(Python、C语言和java实现) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

寫在前面

創建一個鏈表頭文件,其中包含的基本操作和定義,方便以后調用

/* * 專業術語:* 首節點:存放第一個有效數據的節點* 尾節點:存放最后一個有效數據的節點* 頭結點* 1、頭結點的數據類型和【首節點的類型】是--摸一樣的* 2、頭結點是【首節點】前面的那個節點。* 3、頭結點并【不存放有效數據】。* 4、設置頭結點的目的是為了方便對鏈表的操作。* 頭指針* 存放頭結點地址的指針變量* 確定一個鏈表需要一個參數* 頭指針*/#include<stdio.h> #include<stdlib.h> //提供malloc()和free() #include <malloc.h> //開辟空間 #include <string.h> //提供strcpy()等typedef struct LNode{ //定義單鏈表結點類型int data; //數據域,可以是別的各種數據類型,本文統一用int類型struct LNode *next; //指針域 }LNode, *LinkList; //LNode等價于struct LNode; LinkList等價于truct LNode*// 初始化單鏈表 LinkList Init_Table(LinkList L) {L = (LinkList)malloc(sizeof(LNode));L->next = NULL;return L; }//頭插法建立單鏈表 LinkList Head_Insert(LinkList L) {LNode* s; int x;int len;L = (LinkList)malloc(sizeof(LNode));L->next = NULL;printf("頭插法建立單鏈表,請輸入鏈表長度:");scanf("%d",&len);for(int i = 0; i<len; i++){printf("請輸入要插入的整數:");scanf("%d",&x);s = (LinkList)malloc(sizeof(LNode)); //為s分配內存空間s->data = x;s->next = L->next;L->next = s;}return L; }// 尾插法建立帶表頭單鏈表 LinkList Tail_Insert(LinkList L) {LNode* s, *r; // r為表尾指針。int x,len;L = (LinkList)malloc(sizeof(LNode));L->next = NULL;r = L;printf("使用尾插法建立單鏈表,請輸入鏈表長度:");scanf("%d",&len);for(int i = 0; i<len; i++){printf("請輸入要插入的整數:");scanf("%d",&x);s = (LinkList)malloc(sizeof(LNode)); //為s分配內存空間s->data = x;r->next = s; //開始鏈表為空,r指向表頭, 現在需要將s節點鏈接到表頭后面;r = s; //讓r指針指向表尾, 之后每次插入都可以在表尾插入了}r->next = NULL;return L; }// 遍歷鏈表 void Traverse_List(LinkList L) {LNode* p = L->next;while(NULL != p){printf("%d ",p->data);p = p->next;}printf("\n"); }//帶頭結點的單鏈表, 根據索引,查找值 LNode* Get_Elem(LinkList L,int index) {int j = 1;LNode* p = L->next; //第一個值。if(index==0)return L;if(index<0)return NULL;while(p && j < index){p = p->next; //進入循環,是從第二個值開始的,所以要j<indexj++;}return p; }//帶有表頭的單鏈表,按值查找表結點 LNode* Locate_Elem(LinkList L, int key) {LNode* p = L->next;while(p->data!=key && p!=NULL)p = p->next;if(p!=NULL)printf("找到了!");elseprintf("查找失敗!");return p; //找到后返回該節點指針,否則返回NULL. }//帶表頭,刪除鏈表最后一個元素 LinkList Del_Tail_Elem(LinkList L) {LNode* p = L->next; //第一個值, p 最后指向鏈表最后一個值LNode* q = L; //q指向表頭, q 最后指向鏈表倒數第二個值while(NULL!=p->next){q = p; //如果后面還有元素,就把p的地址賦給q,然后讓q指向后面的元素p = p->next;}free(p); // 釋放最后一個值的內存q->next = NULL; //把倒數第二個值的指針域設置為空,就這樣,最后一個值就刪除完成了。return L; }//帶表頭,刪除鏈表第一個元素 LinkList Del_Head_Elem(LinkList L) {LNode* p = L->next; //第一個值,LNode* q = L; //表頭q->next = p->next;free(p);return L; }//帶表頭,求表的長度 int Length(LinkList L) {int len;LNode* p = L->next; //第一個值。if(NULL==L->next)len = 0;while(p!=NULL){len = len + 1;p = p->next;}return len; }// 帶表頭,末尾插入一個元素。 LinkList Insert_Tail_Elem(LinkList L, int key) {LNode* p = L->next;LNode* s;while(NULL!=p->next)p = p->next; // 循環直到p指向最后一個結點s = (LinkList)malloc(sizeof(LNode)); // 為分配內存空間s->data = key;p->next = s;s->next = NULL;return L; }// 帶表頭,頭插法入一個元素。 LinkList Insert_Head_Elem(LinkList L, int key) {LNode* s = NULL;s = (LinkList)malloc(sizeof(LNode));s->data = key;s->next = L->next;L->next = s;return L; }

這里寫目錄標題

    • 寫在前面
    • 1. 合并排序 【Merge Sorted Array】
    • 2. 兩數相加【add two numbers 】
      • C語言
    • 3. Partition List

1. 合并排序 【Merge Sorted Array】

給出兩個排序的整數數組A和B,將B合并到A中作為一個排序的數組。注意:

  • 你可以假設A有足夠的空間來容納B的額外元素。
  • A和B中初始化的元素數分別為m和n。
if __name__ == '__main__':list1 = [1, 3, 5, 7]list2 = [2, 4, 6, 8]list1 = list1+list2list1.sort()print(list1)

2. 兩數相加【add two numbers 】

題目:給你兩個代表兩個非負數的鏈接列表。它們每位數字都是按照逆序的方式存儲的,每個節點都包含一個數字。將這兩個數字相加,并作為一個鏈表返回。

  • 輸入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
  • 輸出:7 -> 0 -> 8
  • 解析:342 + 465 = 807

C語言

解析:因為逆序的方式進行存儲:所以開始存儲時采用頭插法

LinkList Add(LinkList L1,LinkList L2){//兩個表帶首節點進行相加LNode* p = NULL; // 指向最長的鏈表LNode* q = NULL; // 指向最短的鏈表int pro = 0; //表示進位if(Length(L1)>=Length(L2)){p = L1->next;q = L2->next;}else{p = L2->next;q = L1->next;}while(q != NULL) //q指針指向得為最短的鏈表{int temp = p->data + q->data + pro;if (temp >= 10){pro = 1;p->data = temp % 10;}else{pro = 0;p->data = temp;}p = p->next;q = q->next;}while(p != NULL){int temp = p->data + pro;if (temp >= 10){pro = 1;p->data = temp % 10;}else{pro = 0;p->data = temp;}p = p->next;}if(Length(L1)>=Length(L2)){printf("最后的進位數為:%d\n",pro);if(pro != 0)L1 = Insert_Tail_Elem(L1, pro);return L1;}else{printf("最后的進位數為:%d\n",pro);if(pro != 0)L2 = Insert_Tail_Elem(L2, pro);return L2;}}int main(void) {setvbuf(stdout,NULL,_IONBF,0);LNode* Node = NULL;LNode* Node2 = NULL;LinkList L1 = Head_Insert(Node);LinkList L2 = Head_Insert(Node2);LinkList L3 = Add(L1, L2);printf("兩者相加的和為:");Traverse_List(L3);return 0; }

輸出

頭插法建立單鏈表,請輸入鏈表長度:2 請輸入要插入的整數:9 請輸入要插入的整數:9 9 9 頭插法建立單鏈表,請輸入鏈表長度:3 請輸入要插入的整數:9 請輸入要插入的整數:9 請輸入要插入的整數:9 9 9 9 最后的進位數為:1 兩者相加的和為:8 9 0 1

3. Partition List

給出一個鏈接列表和一個值x,對其進行分區,使所有小于x的節點排在大于等于x的節點之前。
你應該保留兩個分區中每個節點的原始相對順序。例如,

  • 給定 1->4->3->2->5->2 和 x = 3,
  • 返回 1->2->2->4->3->5。

總結

以上是生活随笔為你收集整理的Leetcode链表考察(Python、C语言和java实现)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。