題目:實(shí)現(xiàn)一個(gè)單鏈表,鏈表初始為空,支持三種操作:
公司主營業(yè)務(wù):成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出平南免費(fèi)做網(wǎng)站回饋大家。
- 向鏈表頭插入一個(gè)數(shù)
- 刪除第 k 個(gè)插入的數(shù)后面的數(shù);
- 在第 k 個(gè)插入的數(shù)后插入一個(gè)數(shù)
(不知道這里題目有沒有理解錯(cuò),我理解的是刪除第k個(gè)插入的數(shù)(x),x的指針next所指向的數(shù),即刪除第k-1個(gè)插入的數(shù))
第一版源代碼:
#include#includeusing namespace std;
typedef struct ListNode
{int data;//數(shù)據(jù)域
struct ListNode*next;//指針域
}*L;//相當(dāng)于typedef struct ListNode*L;
//創(chuàng)建節(jié)點(diǎn)
void CreateListNode(L*head) //改變鏈表的操作要用指針傳鏈表 ,也可以不用void,而用指針類型的函數(shù) L CreateListNode(L head){...return head;},這里只是想麻煩地練練手,嘻嘻
{*head = (ListNode *)malloc(sizeof(ListNode)); //創(chuàng)建頭結(jié)點(diǎn),為頭結(jié)點(diǎn)分配內(nèi)存
(*head)->next = NULL;//初始化頭結(jié)點(diǎn)的指針head為空指針
}
//向鏈表頭插入一個(gè)數(shù)
void addAtHead(L*head,int val)
{L newhead=(ListNode *)malloc(sizeof(ListNode));//創(chuàng)建新的頭結(jié)點(diǎn),為新的頭結(jié)點(diǎn)分配內(nèi)存
newhead->next=(*head)->next;
(*head)->next=newhead;
newhead->data=val;
}
//刪除第 k 個(gè)插入的數(shù)后面的數(shù)
void deleteAtIndex(L*head,int k)
{L cur=*head;//輔助指針從第一個(gè)節(jié)點(diǎn)開始
while(k--)//遍歷到第k個(gè)位置(非下標(biāo)),循環(huán)次數(shù)是k次
{cur=cur->next;
}
L p=cur->next;
if(cur->next->next!=NULL)
cur->next = cur->next->next;
else cur->next=NULL;
free(p);
}
//在第 k 個(gè)插入的數(shù)后插入一個(gè)數(shù)
void addAtIndex(L*head,int k,int val)
{L newnode=(ListNode *)malloc(sizeof(ListNode));
L cur=*head;//輔助指針從頭指針開始
while(k--) cur=cur->next;//遍歷到第k個(gè)節(jié)點(diǎn)(非下標(biāo)),循環(huán)次數(shù)是k次
newnode->next=cur->next;
cur->next=newnode;
newnode->data=val;
}
//打印出鏈表形態(tài)
void printlist(L head)
{L newnode=head->next;
while(newnode!=NULL)
{cout<data;
if(newnode->next!=NULL)cout<<"->";
newnode=newnode->next;
}
cout<L head;
CreateListNode(&head);
int n,x1,k,x2;
cin>>n;
for(int i=0;icin>>x1;
addAtHead(&head,x1);
}
cin>>k;
cin>>x2;
cout<<"n="<
運(yùn)行結(jié)果:
寫完才發(fā)現(xiàn),好像混用了C和C++(心痛的感覺),于是經(jīng)過一番折騰,又誕生了第二版題解
改進(jìn):
①引用了C++的struct中特有的構(gòu)造函數(shù)(C沒有)
②采用類class
③把malloc換成new
其它一樣
第二版源代碼:
#includeusing namespace std;
typedef struct ListNode
{int data;
struct ListNode *next;
ListNode(int x) : data(x), next(NULL) {}//有參數(shù)構(gòu)造函數(shù),就是初始化, 注意:若要初始化數(shù)組,需先寫無參數(shù)構(gòu)造函數(shù)
}*L;
class MyLinkedList
{private://private在其他類中被隱藏
L head;
public://把public的函數(shù)寫在class外更為清晰明了
CreateListNode();
void addAtHead(int val);
void addAtIndex(int k, int val);
void deleteAtIndex(int k);
void printlist();
};//被漏掉的分號(尷尬)
MyLinkedList::CreateListNode()
{head=new ListNode(0);//不能在private內(nèi)初始化
}
void MyLinkedList::addAtHead(int val)
{L newhead=new ListNode(val);//new是堆中的內(nèi)存塊,與之前的malloc作用相同
newhead->next=head->next;
head->next=newhead;
newhead->data=val;
}
void MyLinkedList::addAtIndex(int k, int val)
{L newnode=new ListNode(val);
L cur=head;
while(k--) cur=cur->next;
newnode->next=cur->next;
cur->next=newnode;
newnode->data=val;
}
void MyLinkedList::deleteAtIndex(int k)
{L cur=head;
while(k--)
{cur=cur->next;
}
L p=cur->next;
if(cur->next->next!=NULL)
cur->next = cur->next->next;
else cur->next=NULL;
delete p;//與之前的free作用相同 ,new分配的內(nèi)存塊由程序員釋放(編譯器不管) ,所以也要回收
}
void MyLinkedList::printlist()
{L newnode=head->next;
while(newnode!=NULL)
{ cout<data;
if(newnode->next!=NULL)cout<<"->";
newnode=newnode->next;
}
cout<MyLinkedList object;//MyLinkedList類里的object成員
object.CreateListNode();
int n,x1,k,x2;
cin>>n;
for(int i=0;icin>>x1;
object.addAtHead(x1);
}
cin>>k;
cin>>x2;
cout<<"n="<
運(yùn)行結(jié)果:(和之前一樣)
學(xué)習(xí)心得:剛開始寫的時(shí)候還不知道頭結(jié)點(diǎn)(不是第一個(gè)節(jié)點(diǎn))的好處,寫著寫著才發(fā)現(xiàn)如果不設(shè)頭指針,鏈表開始的位置在每一次addAtHead的時(shí)候都得改,這樣較為方便
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧