這兩周略有偷懶,沒有按時寫部落格,要堅持!
本週題目
給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且輸出刪除後的鍊錶。示例:給定乙個鍊錶: 1->2->3->4->5, 和 n = 2.當刪除了倒數第二個節點後,鍊錶變為 1->2->3->5.說明:給定的 n 保證是有效的。
我有兩種思路去解決這個問題(是乙個帶頭指標(不存資料,只指向第乙個節點)的鍊錶)
1)用乙個指標,遍歷鍊錶的全部節點,找到第icount - 1 - n個節點,就是那個要刪除的節點。若要刪除頭節點,則更改頭節點;否則直接刪除
這種適用於知道鍊錶總共的節點數,需要將整個鍊錶遍歷一遍
void delete(link *phead,int pos) //pos = icount - 1 - n
printf("這個數字是%d\n",ptemp->data);
pbe->pnext = ptemp->pnext;
free(ptemp);
}else
icount--;
}
2)建立兩個指標,*p1,*p2。在開始時,均指向頭節點。先讓p1走n步,再讓p1,p2同時移動,直至p1->pnext == null,此時p2->pnext就是要刪除的de那個節點。若要刪除頭節點,則更改頭節點;否則,直接刪除。
這種適用於不知道節點數,不用遍歷全部
scanf("%d",&index);
if(index == icount)else if(index > icount || index == 0)else
while(p1->pnext != null)
printf("這個數是%d\n",p2->pnext->data);
p2->pnext = p2->pnext->pnext;
}
在這只寫出了關鍵的步驟,建立鍊錶,輸出鍊錶就省略了,思想最重要。反正**都在git上了。
後來思考了一下,還有第三種,用兩個指標,乙個指向尾,乙個指向頭。判斷n是在後半段還是前半段,若是在後半段,則移動尾指標;反之移動頭指標。時間複雜度和上面的差不多,就不寫了。
用雙向鍊錶也是比較方便的,但是我不會23333。
明天c語言要上機考試了。。。緊髒哈哈哈哈
刪除鍊錶倒數第N個節點
1.問題 給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。示例 給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.2.演算法 暴力破解法 先計算得出鍊錶的長度m,然後將鍊錶長度和所給倒數字置相減,即loc m n 1,得出刪除節點的前...
刪除鍊錶倒數第n個節點
leetcode 題目 給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。給定乙個鍊錶 1 2 3 4 5,和 n 2.當刪除了倒數第二個節點後,鍊錶變為 1 2 3 5.note n 鍊錶長度時,刪除頭節點 n 0時,不做任何操作。當第乙個指標first 比第二個指標領先n步,然後...
鍊錶 刪除鍊錶的倒數第N個節點
給定乙個鍊錶,刪除鍊錶的倒數第 n 個節點,並且返回鍊錶的頭結點。示例 給定乙個鍊錶 1 2 3 4 5,和n 2.當刪除了倒數第二個節點後,鍊錶變為1 2 3 5.說明 給定的 n 保證是有效的。高階 你能嘗試使用一趟掃瞄實現嗎?definition for singly linked list....