面試題(1)順序錶鏈表

2021-08-28 21:47:21 字數 3627 閱讀 4772

1.刪除鍊錶中等於給定值 val 的所有節點。

/**

* definition for singly-linked list.

* struct listnode ;

*/struct listnode* removeelements(struct listnode* head, int val)

else

}if(head->val==val)

return head->next;

else

return head;

}

2.反轉乙個單鏈表。

建立乙個新的結點,重新穿起來

/**

* definition for singly-linked list.

* struct listnode ;

*/struct listnode* reverselist(struct listnode* head)

return newhead;

}

利用3個指標

/**

* definition for singly-linked list.

* struct listnode ;

*/struct listnode* reverselist(struct listnode* head)

return n1;

}

3.給定乙個帶有頭結點 head 的非空單鏈表,返回鍊錶的中間結點。

如果有兩個中間結點,則返回第二個中間結點。

/**

* definition for singly-linked list.

* struct listnode ;

*/struct listnode* middlenode(struct listnode* head)

return slow;

}

4.輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。

/*

struct listnode

};*/

class solution

while(fast)

return slow;

}};

5.將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。

建立乙個節點連線在它後面

/**

* definition for singly-linked list.

* struct listnode ;

*/struct listnode* mergetwolists(struct listnode* l1, struct listnode* l2)

else

tail=tail->next;

}tail->next=l1?l1:l2;

return head->next;

}

找出第乙個最小的數最為頭結點

/**

* definition for singly-linked list.

* struct listnode ;

*/struct listnode* mergetwolists(struct listnode* l1, struct listnode* l2)

else

tail=head;

while(l1 && l2)

else

tail=tail->next;

}tail->next=l1?l1:l2;

return head;

}

6編寫**,以給定值x為基準將鍊錶分割成兩部分,所有小於x的結點排在大於或等於x的結點之前

給定乙個鍊錶的頭指標listnode* phead,請返回重新排列後的鍊錶的頭指標。注意:分割以後保持原來的資料順序不變。

/*

struct listnode

};*/

class partition

else

cur=cur->next;

}gtail->next=null;

ltail->next=greater->next;

phead=less->next;

free(less);

less=null;

free(greater);

greater=null;

return phead;

}};

9.編寫乙個程式,找到兩個單鏈表相交的起始節點。

暴力求解

/**

* definition for singly-linked list.

* struct listnode ;

*/struct listnode *getintersectionnode(struct listnode *heada, struct listnode *headb)

curb=curb->next;

}cura=cura->next;

}return null;

}

有效解法

/**

* definition for singly-linked list.

* struct listnode ;

*/struct listnode *getintersectionnode(struct listnode *heada, struct listnode *headb)

while(curb)

int gap=abs(lena-lenb);

struct listnode *longlist=(lena>lenb)?heada:headb;

struct listnode *shortlist=(lena>lenb)?headb:heada;

while(gap--)

while(longlist&&shortlist)

longlist=longlist->next;

shortlist=shortlist->next;

}return null;

}

10.給定乙個鍊錶,判斷鍊錶中是否有環。

/**

* definition for singly-linked list.

* struct listnode ;

*/bool hascycle(struct listnode *head)

return false;

}

11.給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。 如果鍊錶無環,則返回 null。

/**

* definition for singly-linked list.

* struct listnode ;

*/struct listnode *detectcycle(struct listnode *head)

return slow;}}

return null;

}

單鏈表面試題彙總(1)

逆序列印單鏈表 void ptinttailtohead slistnode phead 刪除乙個無頭結點的非尾節點 void deletenottail slistnode pos 約瑟夫環 slistnode circle slistnode phead,int k tail cur tail ...

鏈表面試題

不改變鍊錶結構,從尾到頭列印單鏈表 遞迴實現 void printlistrevers recursively plist phead printf d phead data 當鍊表非常長的時候,遞迴實現的會導致函式呼叫層級很深,可能導致呼叫棧溢位。用棧不會出現此類情況,顯然用棧實現 的魯棒性會好一...

鏈表面試題

從尾到頭列印單鏈表 棧 遞迴 從尾到頭列印鍊錶 includevoid printtailtohead listnode head while s.empty 空間複雜度o n void printtailtoheadr listnode head cout data 刪除乙個無頭單鏈表的非尾結點 ...