程式設計之美 無頭鍊錶刪除節點

2021-07-16 09:52:05 字數 1947 閱讀 4453

問題描述:

乙個沒有頭指標的鍊錶,從其中刪除任意乙個中間節點(非第乙個,也不是最後乙個)。

思路:

因為當前節點是要被刪除的,所以當前節點的值已經不需要被儲存了,可以直接用下乙個節點的值將其替換。

然後,直接刪除下乙個節點即可。

**:

void delete_node(stnode* &target)

p = target;

target = target->_next;

p->_data = p->_next->_data;

p->_next = p->_next->_next;

delete target;

target = null;

}

擴充套件問題:

給乙個鍊錶和它的頭指標,只遍歷一次,將鍊錶反轉。

思路:

將鍊錶反轉,考慮將指標的指向反轉了即可,然後將頭指標指向原來的最後乙個節點即可。

例如:1->2->3->4->null

將指標的指向反轉

null<-1<-2<-3<-4

**:

void swap_nodes(stnode* &head)

head = p1;

}

完整**:

#include using namespace std;

typedef struct _stnode

stnode;

void printlink(stnode* link)

while (p != null)

cout << "null" <_next)

p = target;

target = target->_next;

p->_data = p->_next->_data;

p->_next = p->_next->_next;

delete target;

target = null;

}void swap_nodes(stnode* &head)

head = p1;

}void main()

;    int len = sizeof(arr)/sizeof(arr[0]);

stnode *ptest = null;

stnode *pnew = null;

stnode *phead = null;

for (i = 0; i < len; i++)

else

}cout << "initial link ***************=" << endl;

printlink(phead);

cout << endl;

test = 6;

ptest = phead;

for(i = 0; i < test-1; i++)

ptest = ptest->_next;

delete_node(ptest);

cout << "after deleting node ***************=" << endl;

printlink(phead);

cout << endl;

cout << "\n\nswap links ***************=" << endl;

swap_nodes(phead);

printlink(phead);

ptest = phead;

while(ptest != null)

cin >> i;

}

程式設計之美 從無頭鍊錶中刪除結點

乙個無頭單鏈表中,乙個指標指向此單鏈表中間的乙個結點 不是第乙個結點,也不是尾結點 請將該結點刪除。思想 在不知道第一結點情況下,這個問題看起來無從下手。但是我們知道要刪除結點的資訊,以及要刪除結點的下一結點資訊以及下下個結點資訊。知道這些,我們可以知道可以較容易刪除要刪除結點的下一結點。如何將問題...

《程式設計之美》 從無頭單鏈表中刪除節點

問題 假設有乙個沒有頭指標的單鏈表。乙個指標指向此單鏈表中間的乙個節點 非第乙個節點,也非最後乙個節點 請將該節點從單鏈表中刪除。分析與解法 若要刪除該節點,正常情況下,應該要知道該節點的前面節點的指標,但是由於單鏈表中沒有頭結點,所以無法追溯到該節點前面的那個節點,因此,這裡採用了 狸貓換太子 的...

程式設計之美 從無頭單鏈表中刪除節點

1.問題描述 假設有乙個沒有頭指標的單鏈表。乙個指標指向此單鏈表中間的乙個節點 不是第乙個,也不是最後乙個 請將該節點從單鏈表中刪除。如下圖所示 2.分析與解法 假設給定的指標為pcurrent,node pnext pcurren next 其中pcurren next!null,如下圖,因為沒有...