鍊錶的常見操作

2021-09-10 13:56:05 字數 4367 閱讀 7572

鍊錶是資料結構的重要內容,在電腦程式中應用廣泛,同時也是各公司筆試題目的重點。

以下簡單實現了鍊錶的一些操作,包括建立、增加節點、刪除節點、單鏈表逆置、合併有序鍊錶等。

一、鍊錶建立

鍊錶主要有三種形式,包括單鏈表、雙鏈表和迴圈鍊錶。

單鏈表每個節點只包含乙個後驅指標,雙鏈表節點同時包含乙個前驅指標和乙個後驅指標,迴圈鍊錶的尾節點的後驅指向頭節點。

**如下:

/*單鏈表節點結構*/

typedef structnodetype

node;

/*雙鏈表節點結構*/

typedef structdnodetype

dnode;

/*建立鍊錶

*/node* createlist(node*head)

return head;

}/*建立雙鏈表*/

dnode* doublelist(dnode*head)

return head;

}/*建立迴圈鍊錶*/

node* cyclelist(node*head)

current->next=head;/*尾節點指向頭節點*/

return head;

}二、鍊錶操作

包括單鏈表的增加節點、刪除節點、輸出鍊錶等

新增節點

/*在尾部插入節點#add 可以直接在指定引數節點插入*/

node*insertnode(node*head ,char elem)

temp=(node*)malloc(sizeof(node));

temp->elem=elem;

temp->next=null;

prev->next=temp;/*尾節點的後驅指向新節點*/

return head;

}/*刪除節點*/

node*deletenode(node*head,char elem)

prev=current;

current=current->next;/*移動至下乙個節點*/

}return head;

}/*輸出鍊錶*/

void printlist(node*head)

cout<<"\n";

}三、單鏈表逆置

單鏈表逆置在各公司的筆試題中比較常見,以下是其中一種實現。

演算法描述:將鍊錶中每乙個節點插入到頭結點之後(#add 將head的next的next插入到head與其next之間)。

**如下:

/*單鏈表逆置*/

node*reverselist(node*head)

return head;

}四、求單鏈表中間節點

在筆試題中比較常見,通常題目描述是:給出乙個單鏈表,不知道節點n的值,怎樣只遍歷一次就可以求出中間節點。

演算法描述:設立兩個指標p1,p2,p1每次移動1個節點位置,p2每次移動2個節點位置,當p2移動到尾節點時,p1指向中間節點。

**如下:

求中間節點

/*求中間節點*/

node* middlenode(node*head)

return p1;

}五、合併有序單鏈表

問題描述:合併2個有序單鏈表,合併後的鍊錶也是排好序的。

演算法描述:對鍊錶a中的每乙個節點元素,查詢其在鍊錶b中的插入位置,並在b中插入該元素。

**如下:

/*合併有序單鏈表*/

node* mergelist(node*h1,node* h2)

return h1;

}六、判斷鍊錶是否有環

判斷鍊錶是否有環即是判斷鍊錶是否為迴圈鍊錶,演算法較為簡單,一次遍歷判斷尾指標是否指向頭指標即可。

**如下:

/*判斷鍊錶是否有環(迴圈鍊錶)*/

bool iscyclelist(node*head)

return false;

}七、總結及原始檔

以上實現了鍊錶的一些常見操作,原始檔linklist.cpp全部**如下: 

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!

鍊錶是資料結構的重要內容,在電腦程式中應用廣泛,同時也是各公司筆試題目的重點。

以下簡單實現了鍊錶的一些操作,包括建立、增加節點、刪除節點、單鏈表逆置、合併有序鍊錶等。

一、鍊錶建立

鍊錶主要有三種形式,包括單鏈表、雙鏈表和迴圈鍊錶。

單鏈表每個節點只包含乙個後驅指標,雙鏈表節點同時包含乙個前驅指標和乙個後驅指標,迴圈鍊錶的尾節點的後驅指向頭節點。

**如下:

/*單鏈表節點結構*/

typedef structnodetype

node;

/*雙鏈表節點結構*/

typedef structdnodetype

dnode;

/*建立鍊錶

*/node* createlist(node*head)

return head;

}/*建立雙鏈表*/

dnode* doublelist(dnode*head)

return head;

}/*建立迴圈鍊錶*/

node* cyclelist(node*head)

current->next=head;/*尾節點指向頭節點*/

return head;

}二、鍊錶操作

包括單鏈表的增加節點、刪除節點、輸出鍊錶等

新增節點

/*在尾部插入節點#add 可以直接在指定引數節點插入*/

node*insertnode(node*head ,char elem)

temp=(node*)malloc(sizeof(node));

temp->elem=elem;

temp->next=null;

prev->next=temp;/*尾節點的後驅指向新節點*/

return head;

}/*刪除節點*/

node*deletenode(node*head,char elem)

prev=current;

current=current->next;/*移動至下乙個節點*/

}return head;

}/*輸出鍊錶*/

void printlist(node*head)

cout<<"\n";

}三、單鏈表逆置

單鏈表逆置在各公司的筆試題中比較常見,以下是其中一種實現。

演算法描述:將鍊錶中每乙個節點插入到頭結點之後(#add 將head的next的next插入到head與其next之間)。

**如下:

/*單鏈表逆置*/

node*reverselist(node*head)

return head;

}四、求單鏈表中間節點

在筆試題中比較常見,通常題目描述是:給出乙個單鏈表,不知道節點n的值,怎樣只遍歷一次就可以求出中間節點。

演算法描述:設立兩個指標p1,p2,p1每次移動1個節點位置,p2每次移動2個節點位置,當p2移動到尾節點時,p1指向中間節點。

**如下:

求中間節點

/*求中間節點*/

node* middlenode(node*head)

return p1;

}五、合併有序單鏈表

問題描述:合併2個有序單鏈表,合併後的鍊錶也是排好序的。

演算法描述:對鍊錶a中的每乙個節點元素,查詢其在鍊錶b中的插入位置,並在b中插入該元素。

**如下:

/*合併有序單鏈表*/

node* mergelist(node*h1,node* h2)

return h1;

}六、判斷鍊錶是否有環

判斷鍊錶是否有環即是判斷鍊錶是否為迴圈鍊錶,演算法較為簡單,一次遍歷判斷尾指標是否指向頭指標即可。

**如下:

/*判斷鍊錶是否有環(迴圈鍊錶)*/

bool iscyclelist(node*head)

return false;

}七、總結及原始檔

以上實現了鍊錶的一些常見操作,原始檔linklist.cpp全部**如下: 

鍊錶的常見操作

include include includeusing namespace std typedef struct nodetype node typedef struct dnodetype dnode 建立單鏈表 node createlist node head node current he...

鍊錶的常見操作

鍊錶是資料結構的重要內容,在電腦程式中應用廣泛,同時也是各公司筆試題目的重點。以下簡單實現了鍊錶的一些操作,包括建立 增加節點 刪除節點 單鏈表逆置 合併有序鍊錶等。一 鍊錶建立 鍊錶主要有三種形式,包括單鏈表 雙鏈表和迴圈鍊錶。單鏈表每個節點只包含乙個後驅指標,雙鏈表節點同時包含乙個前驅指標和乙個...

鍊錶的常見操作

鍊錶是資料結構的重要內容,在電腦程式中應用廣泛,同時也是各公司筆試題目的重點。以下簡單實現了鍊錶的一些操作,包括建立 增加節點 刪除節點 單鏈表逆置 合併有序鍊錶等。一 鍊錶建立 鍊錶主要有三種形式,包括單鏈表 雙鏈表和迴圈鍊錶。單鏈表每個節點只包含乙個後驅指標,雙鏈表節點同時包含乙個前驅指標和乙個...