鏈表面試題

2021-08-04 04:42:54 字數 3144 閱讀 9387

從尾到頭列印單鏈表(棧  遞迴)

//從尾到頭列印鍊錶

#includevoid printtailtohead(listnode* head)

while(!s.empty())

} //空間複雜度o(n)

void printtailtoheadr(listnode* head)

cout<_data<<" ";

}}

.刪除乙個無頭單鏈表的非尾結點

//刪除乙個無頭單鏈表的非尾結點

#includevoid deletenode(listnode* pos)

在無頭單鏈表的乙個非頭結點前插入乙個結點

void pushnohead(listnode* head,listnode* pos,int x)

listnode* node=new listnode();

node->data=x;

node->_next=pos;

prev->_next=node;

}

反轉單鏈表
listnode* reverselist(listnode* head)

return reversehead;

}listnode* reservelist(listnode* head)

return reservehead;

}

單鏈表排序

void bubblesort(listnode* head)

cur=cur->_next;

next=next->_next;

} if(flag==0)

break;

tail=cur; }}

//前後指標法 cur prev prev指向cur的前乙個 cur向後走找比key小的值,找到之後prev++ 二者不等 交換 找不到一直走 cur走到右邊界 prev++ 交換二者

void quicksort(listnode* head,listnode* tail)

cur=cur->_next;

} swap(prev->data,head->data);

quicksort(head,prev);

quicksort(prev->_next,tail);

}

合併兩個有序鍊錶      公升序降序都可以處理:1.用仿函式 2.函式指標 (傳參傳函式指標)

listnode* mergelist(listnode* head1,listnode* head2)

else

return mergehead;

}listnode* mergelistr(listnode* head1,listnode* head2)

else

listnode* tmp=mergehead;

while(node1!=null&&node2!=null)

else

}if(node1==null)

tmp->_next=node2;

if(node2==null)

tmp->_next=node1;

return mergehead;

}

判斷單鏈表是否帶環,若帶環,求環的長度。求環的入口點

//判斷鍊錶帶環,帶環返回相遇點,不帶環,返回null

listnode* cirlist(listnode* head)

return null;

}//若鍊錶帶環,求環的長度 從相遇點開始走,走到相遇點

int cirlength(listnode* head)

return count;

}//若帶環,求入口點 乙個指標從相遇點開始走,乙個指標從頭開始走,兩個指標相遇,相遇點為入口點

listnode* entrynode(listnode* head)

return node1;

}//判斷兩個鍊錶是否相交(不帶環)

bool issame(listnode* head1,listnode* head2)

while(node2->_next!=null)

if(node1==node2)

return true;

else

return false; }

//若相交,求交點

listnode* meetnode(listnode* head1,listnode* head2)

while(node2!=null)

listnode* shortnode=null;

listnode* longnode=null;

int div=0;

if(length1>length2)

else

for(int i=0;i_next;

} while(shortnode!=longnode)

return shortnode;

}//鍊錶相交帶環

//乙個相遇點動,另乙個相遇點不動,看兩個是否相遇,相遇則帶環鍊錶相交,不相遇,帶環鍊錶不相交

//環內相交,環外相交 求入口點,看入口點是不是相同,相同,環外相交,不相同,環內相交

查詢單鏈表的倒數第k個結點。

listnode* findktotail(listnode* head,unsigned int k)

else

}while(fast->_next!=null)

return slow;

}

複雜鍊錶的複製

void clonenode(complexnode* head)

}void clonerandom(complexnode* head)

cur=cur->_next->_next; }}

complexnode* clonecomplex(complexnode* head)

while(cur!=null)

return clonehead;

}void clone(complexnode* head)

鏈表面試題

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

鏈表面試題

typedef int datatype typedef struct node node,pnode,plist void initlist plist pplist void display const plist plist void pushback plist pplist,datatyp...

鏈表面試題

pragma once include typedef int datetype typedef struct listnode listnode 單鏈表實現約瑟夫環 listnode josephcycle listnode first,int k tail next first listnode...