您的位置:首页 > 职场人生

【剑指offer 面试题13】在 O(1) 时间删除链表结点

2015-06-20 15:13 746 查看
#include <iostream>
using namespace std;

//构造链表结点
struct ListNode
{
int val;
ListNode *next;

ListNode(int v = 0):val(v), next(NULL){};
};

//打印结点
void printList(ListNode *head)
{
while(head != NULL)
{
cout<<head->val<<" ";
head = head->next;
}
cout<<endl;
}

//删除结点
void deleteListNode(ListNode **head, ListNode *tobeDeleted)
{
//头结点或者待删除结点为空,则结束调用
if(*head == NULL || tobeDeleted == NULL)
return ;

//待删除结点的pnext非空,则复制其值到待删除结点,删除pnext
if(tobeDeleted->next != NULL)
{
ListNode *pnext = tobeDeleted->next;

tobeDeleted->val = pnext->val;
tobeDeleted->next = pnext->next;

delete pnext;
pnext = NULL;
}
//若只剩头结点,则删除头结点
else if(tobeDeleted == *head)
{
delete tobeDeleted;

tobeDeleted = NULL;
*head = NULL;
}
//若待删除结点为尾结点,则顺序查找后删除
else
{
ListNode *phead = *head;

while(phead->next != tobeDeleted)
{
phead = phead->next;
}

phead->next = NULL;
delete tobeDeleted;
tobeDeleted = NULL;
}
}

int main()
{
ListNode *ls = new ListNode(0);
ListNode *head = ls;

ListNode *l1 = new ListNode(1);
ls->next = l1;
ls = ls->next;

ListNode *l2 = new ListNode(2);
ls->next = l2;
ls = ls->next;

ListNode *l3 = new ListNode(3);
ls->next = l3;
ls = ls->next;

ListNode *l4 = new ListNode(4);
ls->next = l4;
ls = ls->next;

cout<<"初始链表 -> ";
printList(head);
cout<<endl;

cout<<"删除中间结点2后 -> ";
deleteListNode(&head,l2);
printList(head);
cout<<endl;

cout<<"删除尾结点4后 -> ";
deleteListNode(&head,l4);
printList(head);
cout<<endl;

cout<<"删除中间结点1后 -> ";
deleteListNode(&head,l1);
printList(head);
cout<<endl;

cout<<"删除尾结点3后 -> ";
deleteListNode(&head,l1);
printList(head);
cout<<endl;

cout<<"删除头结点后 -> ";
deleteListNode(&head,head);
printList(head);
cout<<endl;
}


测试结果:

初始链表 -> 0 1 2 3 4

删除中间结点2后 -> 0 1 3 4

删除尾结点4后 -> 0 1 3

删除中间结点1后 -> 0 3

删除尾结点3后 -> 0

删除头结点后 ->
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: