c++实现关于链表问题的面试题(链表的基本操作+从尾到头打印链表+链表中倒数第k个节点)(一)

1.在链表的末尾添加一个节点:

//节点的定义
struct ListNode{
	int data;
	ListNode* next;
};
//插入节点
void AddToTail(ListNode** pHead,int value){
	ListNode* pNew=new ListNode();
	pNew->data=value;
	pNew->next=nullptr;
	if(*pHead==nullptr){
		*pHead=pNew;
	}
	else{
		ListNode* pNode=*pHead;
		while(pNode->next!=nullptr)
			pNode=pNode->next;
		pNode->next=pNew;
	}
}

函数的第一个参数pHead是一个指向指针的指针。当我们往一个空链表中插入一个节点时,新插入的节点就是链表的头指针。由于此时会改动头指针,因此必须把pHead参数设为指向指针的指针,否则除了这个函数pHead仍然是一个空指针。
2.在链表中找到第一个含有某值的节点并删除该节点:

void RemoveNode(ListNode** pHead,int value){
	if(pHead==nullptr||*pHead==nullptr){
		return;
	}
	ListNode* pToBeDeleted=nullptr;
	if((*pHead)->data==value){
		pToBeDeleted=*pHead;
		*pHead=(*pHead)->next;
	}
	else{
		ListNode* pNode=*pHead;
		while(pNode->next!=nullptr&&pNode->next->data!=value)
			pNode=pNode->next;
		if(pNode->next!=nullptr&&pNode->next->data==value){
			pToBeDeleted=pNode->next;
			pNode->next=pNode->next->next;
		}
	}
	if(pToBeDeleted!=nullptr){
		deleted pToBeDeleted;
		pToBeDeleted=nullptr;
	}
}

3.从尾到头打印链表:
如果链表不可以修改,可以借助栈来实现:

void PrintListReversingly(List* pHead){
	stack<ListNode*>nodes;
	ListNode* pNode=pHead;
	while(pNode!=nullptr){
		nodes.push(pNode);
		pNode=pNode->next;
	}
	while(!nodes.empty()){
		pNode=nodes.top;
		cout<<pNode->data<<" ";
		nodes.pop();
	}
}

4.链表中倒数第k个节点:
如果我们想要找到倒数第k的节点,则这个节点从头开始数就是第n-k+1个节点。
我们只需要定义两个指针,第一个指针从链表的头节点开始遍历向前走k-1步,第二个指针保持不动,从第k步开始,第二个指针也开始从链表的投指针开始遍历,由于两个指针距离保持在k-1,当第一个指针到达链表的尾节点时,第二个指针正好指向倒数第k个节点。

ListNode* FindKthToTail(ListNode* pListHead,unsigned int k){
	if(pListHead==nullptr||k==0)
		return nullptr;
	ListNode* pAhead=pListHead;
	ListNode* pBehind=nullptr;
	for(unsigned int i=0;i<k-1;i++){
		if(pAhead->next!=nullptr)
			pAhead=pAhead->next;
		else{
			return nullptr;
		}
	}
	pBehind=pListHead;
	while(pAhead->next!=nullptr){
		pAhead=pAhead->next;
		pBehind=pBehind->next;
	}
	return pBehind;
}

猜你喜欢

转载自blog.csdn.net/fightingPPX/article/details/83539117
今日推荐