国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

《算法通關村第一關——鏈表青銅挑戰(zhàn)筆記》

這篇具有很好參考價值的文章主要介紹了《算法通關村第一關——鏈表青銅挑戰(zhàn)筆記》。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

第一關——鏈表

1、青銅挑戰(zhàn)——創(chuàng)建+增刪改查(c++)

1.1鏈表的內部結構

鏈表中每個結點內部的“生態(tài)環(huán)境”。

《算法通關村第一關——鏈表青銅挑戰(zhàn)筆記》,學習筆記,算法,鏈表,筆記
數(shù)據域存儲元素的值,指針域存放指針。
示例:
《算法通關村第一關——鏈表青銅挑戰(zhàn)筆記》,學習筆記,算法,鏈表,筆記

1.2鏈表的定義

struct linkNode
{
	int val;      //代表數(shù)據
	struct linkNode *next;  //代表指針
};

1.3理解C 語言里是如何構造出鏈表

c語言構造鏈表 可分為三步
1.創(chuàng)建頭指針。
2.創(chuàng)建頭結點,使頭指針指向頭結點。
3.循環(huán)創(chuàng)建結點,并使前一個結點指向當前結點。
1.)創(chuàng)建結點。
2.)使前一個結點指向當前結點。
3.)前一個結點變?yōu)楫斍肮?jié)點(為下一次循環(huán)準備)。

代碼如下:

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

struct LinkNode
{
	int val;      //代表數(shù)據
	struct LinkNode *next;  //代表指針
};

struct LinkNode *initLink()
{
	//1.創(chuàng)建頭指針。
	struct LinkNode *p = NULL;
	//2.創(chuàng)建頭結點,使頭指針指向頭結點。
	struct LinkNode *temp = (struct LinkNode *)molloc(sizeof(struct LinkNode));
	p = temp;
	//3.循環(huán)創(chuàng)建結點,并使前一個結點指向當前結點。
	for(int i = 0;i < 5;i++)
	{
		 //1.)創(chuàng)建結點。
	 	struct LinkNode *a = (struct LinkNode *)malloc(struct LinkNode);
		a->val = i;
		a->next = NULL;
		//2.)使前一個結點指向當前結點。
		temp->next = a;
		//3.)前一個結點變?yōu)楫斍肮?jié)點
		temp = temp->next;
	}
	return p;
}

int main()
{
	struct LinkNode * q;
	printf("創(chuàng)建鏈表1,2,3,4");
	q = initLink();
	return 0;
}

1.4鏈表增加元素,首部、中間和尾部分別會有什么問題,該如何處理?

1.4.1 首部插入

《算法通關村第一關——鏈表青銅挑戰(zhàn)筆記》,學習筆記,算法,鏈表,筆記

注意:
要將新插入的結點重新設為head結點。

處理:

NewNode->next = head;
head = NewNode; 

《算法通關村第一關——鏈表青銅挑戰(zhàn)筆記》,學習筆記,算法,鏈表,筆記

1.4.2 中間插入

《算法通關村第一關——鏈表青銅挑戰(zhàn)筆記》,學習筆記,算法,鏈表,筆記
注意:
1.要在插入的前一個結點停下(這就好比一邊過河一邊拆橋,結果自己也回不去了。)
2.要先連要插入位置后面的結點(否則后面的就無法連接了)

處理:

NewNode.next = temp->next;
temp->next = NewNode; 

1.4.3 尾部插入

《算法通關村第一關——鏈表青銅挑戰(zhàn)筆記》,學習筆記,算法,鏈表,筆記

注意:沒什么注意的
處理:

temp->next = NewNode;

1.5鏈表刪除元素,首部、中間和尾部分別會有什么問題,該如何處理?

1.5.1 刪除首部

《算法通關村第一關——鏈表青銅挑戰(zhàn)筆記》,學習筆記,算法,鏈表,筆記

處理:

head = head->next; 

1.5.2 刪除中間

《算法通關村第一關——鏈表青銅挑戰(zhàn)筆記》,學習筆記,算法,鏈表,筆記

注意:用cur.next來比較,找到位置后,將cur->next指針的值更新為cur->next->next。
處理:

cur->next = cur->next->next;

1.5.3 刪除尾部

《算法通關村第一關——鏈表青銅挑戰(zhàn)筆記》,學習筆記,算法,鏈表,筆記
注意:找到要刪除位置的前一個結點并判斷 是否cur->next = 40
處理:

cur->next = NULL; 

1.6雙向鏈表是如何構造的,如何實現(xiàn)元素的插入和刪除

1.6.1 雙向鏈表的如何構造

《算法通關村第一關——鏈表青銅挑戰(zhàn)筆記》,學習筆記,算法,鏈表,筆記

typedef struct DoubleNode
{
	// 數(shù)據域
	int data;
	// 指向下一個結點
	struct DoubleNode *next;
	struct DoubleNode *prev;
}DoubleNode;
//創(chuàng)建新結點
DoubleNode* newNode(int data) 
{
	DoubleNode *newNode = (DoubleNode*)malloc(sizeof(DoubleNode));
	newNode->data = data;
	newNode->next = NULL;
	newNode->prev = NULL;
	return newNode;
}

1.6.1 雙向鏈表的插入

頭插

與單鏈表類似。
注意:
1.讓新頭結點prev 指向 鏈表的最后Newhead->prew = head->prew。
2.新頭結點next 指向 舊的頭結點。
3. 末尾結點next 指向 新頭結點
4.舊頭結點prev 指向 新頭結點。
5.若鏈表為空,要注意額外處理。


void insertFirst(int p)
{
	DoubleNode *NewNode = (DoubleNode *)malloc(sizeof(DoubleNode));
	NewNode->data = p; 
	if(head == NULL)
		head = NewNode;
	else
	{
		NewNode->prev = head->prev;
		NewNode->next = head;
		NewNode->prev->next = NewNode;
		head->prev = NewNode;
	}
}
尾插

與頭插類似。
== 舊尾結點last = head->prew==

void insertlast(int p)
{
    DoubleNode *NewNode = (DoubleNode *)malloc(sizeof(DoubleNode));
    NewNode->data = p; 
    if(head == null){
       head = NewNode;
    }
    else
    {
 	  	NewNode->prev = head->prev;
 	  	NewNode->next = head->prev->next;
		NewNode->next->prev = NewNode;
		head->prev->next = NewNode;
	}
    return head;
}
中間插入

《算法通關村第一關——鏈表青銅挑戰(zhàn)筆記》,學習筆記,算法,鏈表,筆記
在某個元素之前插入元素

/*在第add位置的前面插入data節(jié)點*/
DoubleNode * InsertListHead(DoubleNode * head,int add,int data)
{
    /*新建數(shù)據域為data的結點*/
    DoubleNode * NewNode=(DoubleNode*)malloc(sizeof(DoubleNode));
    if(temp== NULL)
    {
        printf("創(chuàng)建錯誤\n");
        return NULL;
    }    
    else
    {
        NewNode->data = data;
        NewNode->prev = NULL;
        NewNode->next = NULL; 
    }
    /*插入到鏈表頭,要特殊考慮*/
    if (add==1)
    {
        NewNode->next = head;
        head->prev = NewNode;
        head = NewNode;
    }
    else
    {
        Node * body = head;
        /*找到要插入位置的前一個結點*/
        for (int i=1; i<add-1; i++)
        {
            body = body->next;
        }
        /*判斷條件為真,說明插入位置為鏈表尾*/
        if (body->next == NULL)
        {
            NewNode->prev = head->prev;
 	  		NewNode->next = head->prev->next;
			NewNode->next->prev = NewNode;
			head->prev->next = NewNode;
        }
        else
        {
            body->next->pre = NewNode;
            NewNode->next = body->next;
            body->next = NewNode;
            NewNode->pre = body;
        }
    }
    return head;
}

1.6.1 雙向鏈表的刪除

雙向鏈表的增刪改查要比單鏈表麻煩很多

頭尾刪除

頭刪

DoubleNode *deleteFirst(){
    //頭節(jié)點判空
    if(head == null){
        printf("鏈表為空,不可刪除");
        return null;
    }
    DoubleNode *temp = first;
    //第二個節(jié)點的prev指向尾節(jié)點,完成前循環(huán)
    head->next->prev = head->prev;
    //尾節(jié)點的next指向第二個節(jié)點
    head->prev->next = head->next;
    //更新頭節(jié)點
    head = head->next;
    return temp;
}

尾刪

DoubleNode *deleteLast(){
    //首先判空
    if(head == null){
        printf("鏈表為空,無法刪除");
        return null;
    }
    //快速獲取尾節(jié)點
    DoubleNode last = head->prev;
    //頭節(jié)點prev指向倒數(shù)第二個節(jié)點,完成前循環(huán)
    head->prev = last->prev;
    //倒數(shù)第二個next指向head,完成后循環(huán)
    last->prev->next = head;
    return temp;
}
刪除中間
DoubleNode * DeleteList(DoubleNode * head,int data)
{
    DoubleNode * temp = head;
    /*遍歷鏈表*/
    while (temp)
    {
        /*判斷當前結點中數(shù)據域和data是否相等,若相等,刪除該結點*/
        if (temp->data == data) 
        {
            /*判斷是否是頭結點*/
            if(temp->pre == NULL)
            {
                head = temp->next;
                temp->next = NULL;
                free(temp);
                return head;
            }
            /*判斷是否是尾節(jié)點*/
            else if(temp->next == NULL)
            {
                temp->pre->next = NULL;
                free(temp);
                return head;
            }
            else
            {
                temp->pre->next = temp->next;
                temp->next->pre = temp->pre;
                free(temp);
                return head;   
            }
        }
        //不相等就向后移動
        temp =temp->next;
    }
    printf("沒有發(fā)現(xiàn) %d!\n",data);
    return head;
}

第一次發(fā)博客,如有錯誤歡迎指正文章來源地址http://www.zghlxwxcb.cn/news/detail-609387.html

到了這里,關于《算法通關村第一關——鏈表青銅挑戰(zhàn)筆記》的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 算法通關村第一關-鏈表青銅挑戰(zhàn)筆記

    算法通關村第一關-鏈表青銅挑戰(zhàn)筆記

    平時我們一般都是用數(shù)組,每個數(shù)組都會有一個相對應的索引,這樣就使得數(shù)組能夠方便的調用出對應索引得到需要的數(shù)據,但是這也造成了一個問題,那就是不好在數(shù)組中插入或者刪除一個數(shù)據,例如 int arr[]={1,2,4,5}如果我想在數(shù)組中的2和4中添加一個數(shù)據3 那么我們首先就

    2024年02月15日
    瀏覽(25)
  • [Go版]算法通關村第一關青銅——鏈表青銅挑戰(zhàn)筆記

    [Go版]算法通關村第一關青銅——鏈表青銅挑戰(zhàn)筆記

    單向鏈表圖示: 雙向鏈表圖示: 環(huán)形單向鏈表圖示: 環(huán)形雙向鏈表圖示: 源碼地址: GitHub-golang版本 如果是單向的,需要將當前節(jié)點 定位到要插入節(jié)點的前一個節(jié)點 ,否則一旦過了將無法回頭找到前一個節(jié)點 如果是雙向的,將當前節(jié)點 定位到要插入節(jié)點的前一個節(jié)點、

    2024年02月13日
    瀏覽(21)
  • 【無標題】算法通關村第一關——鏈表青銅挑戰(zhàn)筆記

    【無標題】算法通關村第一關——鏈表青銅挑戰(zhàn)筆記

    算法通關村第一關——鏈表青銅挑戰(zhàn)筆記 C語言是如何構造出鏈表的 0.定義節(jié)點結構 1.建立頭指針 2.建立temp指針 3.將節(jié)點連起來 3.1 把p指向temp 3.2 設立循環(huán)節(jié)點a+temp指向a+temp變?yōu)閍

    2024年02月15日
    瀏覽(24)
  • 算法通關村第一關——鏈表青銅挑戰(zhàn)筆記(單鏈表)

    在LeeCode中一般這樣創(chuàng)建鏈表 要注意創(chuàng)建一個變量來遍歷,不要把head丟掉了 count position - 1可以方便操作,還能防止下標越界(cur為null)

    2024年02月15日
    瀏覽(21)
  • [Go版]算法通關村第一關——鏈表青銅挑戰(zhàn)筆記

    [Go版]算法通關村第一關——鏈表青銅挑戰(zhàn)筆記

    單向鏈表圖示: 雙向鏈表圖示: 環(huán)形單向鏈表圖示: 環(huán)形雙向鏈表圖示: 源碼地址: GitHub-golang版本 如果是單向的,需要將當前節(jié)點 定位到要插入節(jié)點的前一個節(jié)點 ,否則一旦過了將無法回頭找到前一個節(jié)點 如果是雙向的,將當前節(jié)點 定位到要插入節(jié)點的前一個節(jié)點、

    2024年02月15日
    瀏覽(21)
  • 算法通關存第一關------鏈表青銅挑戰(zhàn)筆記

    如上代碼其實就已經構造出了一個鏈表。 定義一個Node結點類,他有兩個屬性var,和next。由于next是Node類型,這時候next又會指向同為Node類型的對象,這個對象也擁有var,和next兩個屬性,由此構造出一個鏈表。 文章最后會有構造鏈表實例,完整代碼。 ? 2.1 插入結點 在插入鏈

    2024年02月15日
    瀏覽(18)
  • 編程導航算法通關村第一關|青銅|鏈表基礎

    編程導航算法通關村第一關|青銅|鏈表基礎

    JVM有棧區(qū)和堆區(qū) 棧區(qū):存引用,就是指向實際對象的地址。。 堆區(qū):存的是創(chuàng)建的對象。 定義 規(guī)范的鏈表定義 LeetCode算法題中常用 遍歷 插入 刪除 結點 結構遍歷 插入 從頭插入 從尾插入 從某個值為key的節(jié)點后面插入 刪除 刪除頭結點 刪除尾結點 按值刪除

    2024年02月15日
    瀏覽(52)
  • 算法通關村|青銅挑戰(zhàn)----鏈表

    前言:數(shù)據結構的基礎:創(chuàng)建+增刪改查 學習目標:單鏈表的創(chuàng)建+增刪改查,雙鏈表的創(chuàng)建+增刪改查 數(shù)據域+指針域 數(shù)據域:當前節(jié)點的元素值 指針域:當前節(jié)點保存的下一個節(jié)點的元素的地址,其中最后一個元素的指針域指向null 標準的面向對象的節(jié)點的定義: LeetCode中節(jié)

    2024年02月15日
    瀏覽(18)
  • 算法通關村第一關——鏈表經典問題之雙指針筆記

    算法通關村第一關——鏈表經典問題之雙指針筆記

    基本結構 1.尋找中間結點 2.尋找倒數(shù)第k個元素 3.旋轉鏈表

    2024年02月14日
    瀏覽(21)
  • 算法通關村第一關——鏈表經典問題之雙指針專題筆記

    我一直覺得雙指針是一個非常好用的方法,在鏈表中可以使用,在數(shù)組中依然可以,很靈活。 1. 尋找中間結點 ????????用兩個指針 slow 與 fast 一起遍歷鏈表。slow 一次走一步, fast 一次走兩步。那么當 fast 到達鏈表的末尾時,slow 必然位于中間。 2. 尋找倒數(shù)第K個元素 在這

    2024年02月15日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包