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;
}