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 刪除乙個無頭單鏈表的非尾結點 ...