刪除鍊錶的倒數第幾個節點

2021-09-21 07:41:25 字數 1133 閱讀 1421

這兩周略有偷懶,沒有按時寫部落格,要堅持!

本週題目

給定乙個鍊錶,刪除鍊錶的倒數第 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....