問題描述:
乙個沒有頭指標的鍊錶,從其中刪除任意乙個中間節點(非第乙個,也不是最後乙個)。
思路:
因為當前節點是要被刪除的,所以當前節點的值已經不需要被儲存了,可以直接用下乙個節點的值將其替換。
然後,直接刪除下乙個節點即可。
**:
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,如下圖,因為沒有...