1. 程式人生 > >遍歷一次刪除倒數第k個節點

遍歷一次刪除倒數第k個節點

如果遍歷兩遍連結串列,很容易就能想到方法,先遍歷一邊求出連結串列長度n,遍歷第二遍時遍歷到n-k位置刪除n-k+1個節點

現在是遍歷一遍過程也很簡單

1.宣告兩個指標p、q,分別指向連結串列頭結點,讓p遍歷到第k個節點處

2.若p還沒到k處就指向空,則連結串列長度不夠,返回head

2p、q同時開始遍歷連結串列直到p遍歷到連結串列最後一個節點,這是q到達n-k個節點處,刪除到q的下一個節點即可

程式碼:

Node * deleteN(Node * head, int n) {
        if (head == NULL || n <= 0)
		return head;
	Node * pNode = head->next;
	for (int i = 0; i < n; i++) {
		if (pNode->next != NULL)
			pNode = pNode->next;
		else
			return head;
	}
	Node * qNode = head->next;
	while (pNode->next)//到達要刪除節點的前一個節點
	{
		pNode = pNode->next;
		qNode = qNode->next;
	}
	Node * temp = qNode->next;
	qNode->next = qNode->next->next;
	delete temp;
	return head;
}

執行結果: