コンテンツ
1.整数へのバイナリリンクリスト
元のタイトルリンク:1290。整数へのバイナリリンクリスト-LeetCode(leetcode-cn.com)
アイデア:ノードごとに変換します。1の場合は加算します。0の場合は次のデータを判断します。すべてのデータの加算は10進数です。
コードは次のように表示されます。
int getDecimalValue(struct ListNode* head){
struct ListNode *p=head;
int sum=0;
while(p){
sum+=p->val;
p=p->next;
if(p)
sum<<=1;//左移,用来将一个数的各二进制位全部左移1位,右补0
}
return sum;
}
2.リンクリストのノードを削除します
元のタイトルリンク:237。リンクリスト内のノードを削除します-LeetCode(leetcode-cn.com)
アイデア:次のノードのデータを削除する必要のあるノードにコピーします。
コードは次のように表示されます。
void deleteNode(struct ListNode* node) {
node->val=node->next->val;
node->next=node->next->next;
}
3.リンクリスト要素を削除します
元のタイトルリンク:203。リンクリスト要素を削除します-LeetCode(leetcode-cn.com)
アイデア:削除する要素ノードのポインタフィールドを次のノードにポイントします。ノードがリンクリストの最後にある場合は、ポインタフィールドを直接NULLにポイントします。
コードは次のように表示されます。
法一:
struct ListNode* removeElements(struct ListNode* head, int val){
struct ListNode *prev=NULL,*cur=head;//prev为cur的前一个节点
while(cur)
{
if(cur->val==val)
{
if(cur==head)//所需移除元素在链表头部时
{
head=cur->next;
cur=head;
}
else
{
prev->next = cur->next;
free(cur);
cur=prev->next;
}
}
else
{
prev = cur;
cur=cur->next;
}
}
return head;
}
法二:
struct ListNode* removeElements(struct ListNode* head, int val){
while(1)
{
if(head==NULL)return NULL;//判断链表是否为空
if(head->val==val)
{
head=head->next;
continue;
}//判断头节点
struct ListNode *cur=head;
while(cur){
if(cur->val==val)
{
break;
}
cur=cur->next;
}//遍历链表
if(cur==NULL)return head;
cur=head;
while(cur->next->val!=val)
{
cur=cur->next;
}//寻找删除元素
struct ListNode *q;
q=cur->next;
cur->next=q->next;
free(q);
}
}
4.順序付きリストをマージします
元のタイトルへのリンク:21。2つの順序付きリストをマージします-LeetCode(leetcode-cn.com)
アイデア:
コードは次のように表示されます。
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
if(l1==NULL){
return l2;
}
if(l2==NULL){
return l1;
}//判断是否有空链表,若有则无需合并
struct ListNode *head=NULL,*tail=NULL;
while(l1&&l2)
{
if(l1->val < l2->val){
if(head==NULL){
head=tail=l1;
}
else{
tail->next=l1;
tail=l1;
}
l1=l1->next;
}
else{
if(head==NULL){
head=tail=l2;
}
else{
tail->next=l2;
tail=l2;
}
l2=l2->next;
}
}
//若两个链表其中一个已经到了链表尾部
if(l1){
tail->next=l1;
}
else{
tail->next=l2;
}
return head;
}
5.リンクリストの中間ノード
元のタイトルリンク:876。リンクリストの中央ノード-LeetCode(leetcode-cn.com)
アイデア:2つのポインターを定義します。1つは高速でもう1つは低速で、低速は一度に1つのノードをウォークし、高速は一度に2つのノードをウォークし、低速は高速が終了するとリンクリストの中央に移動します。
コードは次のように表示されます。
struct ListNode* middleNode(struct ListNode* head){
struct ListNode *slow=head,*fast=head;
if(head==NULL){
return NULL;
}
while(fast&&fast->next){
slow=slow->next;
fast=fast->next->next;
}
return slow;
}
6.リンクリスト内の重複要素を削除します
元のタイトルへのリンク:83。並べ替えられたリスト内の重複する要素を削除する-LeetCode(leetcode-cn.com)
アイデア:高速ポインターと低速ポインターのペアを定義します。同じ要素がある場合は、後者のノードを解放します。
コードは次のように表示されます。
struct ListNode* deleteDuplicates(struct ListNode* head){
struct ListNode* cur=head,*prev=NULL;
if(head==NULL)return NULL;//判读链表是否为空
if(head!=NULL)
{
prev=cur;
cur=prev->next;
}//判断前两个节点
//遍历链表
while(cur){
if(prev->val==cur->val)
{
prev->next=cur->next;
printf("prev:%p\n",prev);
free(cur);
cur=prev->next;
printf("prev:%p\n",prev);
}
else{
prev=cur;
cur=cur->next;
}
}
return head;
}
最後に書く
以上がこの記事の全内容です。作者の知識レベルは限られています。間違いや改善点があれば、みんなに指摘してもらいたいです。もっと良いコードがあれば、ブロガーにメッセージを残してください。ブロガーはCSDNであなたと一緒に進歩することを望んでいます。