1.反轉乙個鍊錶,不能申請新空間:
思路:反轉乙個鍊錶,不申請新空間,即將乙個鍊錶通過頭插+頭刪的方法進行替換;
反轉前:1->2->3->4->5->null;
反轉後:null->5->4->3->2->1;
struct listnode* reverselist(struct listnode* head)
return result;
}
2.刪除表中指定的所有節點:
思路:判斷鍊錶的的節點的值是否為指定節點的值有三種情況:
(1)當頭節點為空時的情況;
(2)當頭節點為指定節點的值時的情況;
(3)當頭節點不是指定節點時的情況;
struct listnode* removeelement
struct listnode* node=head;
while(node->next!=null)
else
if(head->val==val)
else
3.合併兩個有序鍊錶:
將兩個鍊錶合併成乙個有序鍊錶,並返回;新煉表是通過拼接兩個鍊錶所給定的鍊錶的值;
如:1->2->4,1->3->4;
拼接後:1->1->2->2->3->4->4;
struct listnode* mergotwolist(struct listnode* l1,struct listnode* l2)
if(l2==null)
//建立乙個新鍊錶,將兩個拼接的鍊錶放到新煉表中;
struct listnode* l1=c1;
struct listnode* l2=c2;
struct listnode* begin=null;
struct listnode* end=null;
while(c1!=null&&c2!=null)
else
c1 = c1->next;
}else
else
c2 = c2->next;}}
if (c1!= null)
if (c2 != null)
return result;
}
4.分割鍊錶問題:
編寫**,給定乙個值x為基準,將鍊錶分割為兩部分,所有小於x的結點排在大於或等於x的鍊錶之前;分割以後要保持原來的資料順序不變;
注意:需要注意比x小的或比x大的鍊錶有為空的情況;一定要保證結果鍊錶的最後乙個節點為null;
struct listnode *partition(struct listnode *phead, int x)
else
}else
else
}node = node->next;
}if (smalllast != null)
if (biglast != null)
if (smalllast != null)
else
}
5.返回鍊錶的中間節點:
給定乙個帶有頭結點head的非空單鏈表,返回鍊錶的中間結點,如果兩個中間結點,則返回第二個中間結點;在這裡考察的主要是指標的運用,通過快慢指標進行遍歷,當乙個指標指向null時,另乙個指標剛好指向該鍊錶的中間節點;
struct listnode *middlenode(struct listnode * head)
slow = slow->next;
fast = fast->next;
}return slow;
}
6.刪除鍊錶中的重複節點問題:
在乙個排序的鍊錶中存在著重複得結點,請刪除該鍊錶中的重複結點,重複的結點不保留,返回煉表頭指標;如:鍊錶1->2->3->3->4->4->5,處理後為1->2->3->4->5;
這裡可以通過雙指標遍歷去查詢,當前面的指標指向的節點的值與後乙個指標指向節點的值相同時,後面的指標指向的位置不變,前面的指標繼續向前走,當兩個指標指向的值不同時,後面的指標走到前面的指標的位置,前面的指標繼續向前尋找,知道遇到null;
struct listnode *deleteduplication(struct listnode * phead)
struct listnode *fack = (listnode *)malloc(sizeof(listnode));
fack->next = phead;
struct listnode * prev = fack;
struct listnode * p1 = phead;
struct listnode * p2 = phead->next;
while (p2 != null)
else
prev->next = p2;
p1 = p2;
if (p2 != null)}}
phead = fack->next;
free(phead);
return fack->next;
}
7.找到兩鍊錶交叉的起始節點://先求出鍊錶的長度;
int getlength(struct listnode * head)
return len;
}struct listnode *getintersectionnode(struct listnode *pheada, struct listnode *pheadb)
for (int i = 0; i < diff; ++i)
while (longer != shorter)
return longer;
}
8.判斷鍊錶是否帶環,找到環的入口點:struct listnode *detcctcycle(struct listnode *head)
struct listnode* fast = head;
struct listnode *slow = head;
while (1)
fast = fast->next;
if (fast == null)
slow = slow->next;
if (fast == slow)
}struct listnode * n1 = head;
struct listnode *n2 = slow;
while (n1 != n2)
return n1;
}
關於鍊錶的筆試 面試題
以下題目 於leetcode 有兩個鍊錶,它們表示逆序的兩個非負數。計算出兩個數的和之後,同樣逆序輸出作為乙個鍊錶 比如 2 1 3 5 6 4 得到 7 0 8 add two numbers class solution if carry 0 prev next new listnode car...
IT筆試面試題整理 反轉鍊錶
試題描述 定義乙個函式,輸入乙個鍊錶的頭節點,反轉該鍊錶並輸出反轉後鍊錶的頭節點 參考 方法一 1 public static link reverselinklist link head 217 cur.next pre 當current為最後乙個節點時,back為null,所以要再指向前節點 1...
鍊錶筆試面試題
有些許錯誤,第乙個程式 1.已知鍊錶的頭結點head,寫乙個函式把這個鍊錶逆序 cpp view plain copy void list reverse head next null head p 遞迴方法 cpp view plain copy void list reverse2 list n...