您的位置:首页 > Web前端

day05删除一个无头单链表的非尾节点 +从尾到头打印单链表+复杂链表的复制

2017-07-17 23:39 555 查看
1.删除一个无头单链表的非尾节点,时间复杂度为O(1)

struct ListNode
{
int val;
ListNode *next;

ListNode(int x):val(x),next(NULL) { }
};
//节点的后一个节点赋值给要删除的节点,再删除这个后面的节点。
int DelNotTail(ListNode *delnode)
{
if(delnode == NULL)
return -1;

ListNode *pnext = delnode->next;
delnode->val = pnext->val;
delnode->next = pnext->next;
delete pnext;

return 0;


从尾到头打印单链表

struct ListNode
{
int val;
ListNode *next;

ListNode(int x):val(x),next(NULL) { }
};

void Print(ListNode *phead)
{
if(phead == NULL)
return ;
Print(phead->next);
cout << phead->val <<endl;
}


复杂链表的复制

一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个random指针指向这个链表中的一个随机节点或者NULL,现在要求实现复制这个链表,返回复制后的新链表。

struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};

RandomListNode* Clone(RandomListNode* pHead)
{
if(pHead == NULL)
return NULL;
//第一步:每一个节点的后面插入一个新的节点
RandomListNode *pcur = pHead;

while(pcur)
{
RandomListNode *pm = new RandomListNode(pcur->label);
pm->next = pcur->next;
pcur->next = pm;

pcur = pm->next;
}

//第二步:为每一个新节点的随机指针赋值
pcur = pHead;
while(pcur)
{
RandomListNode *pnext = pcur->next;  //指向新的节点

if(pcur->random == NULL)
pnext->random = NULL;
else
pnext->random = pcur->random->next;

pcur = pnext->next;
}

//第三步:将新的链表拆下来
RandomListNode *ph = pHead->next;
RandomListNode *pold = pHead;
RandomListNode *pnew = ph;

while(pnew)
{
pold->next = pnew->next;
pold = pnew->next; //当pnew指向最后一个节点时,此时pold指向空了,
pnew->next = (pold == NULL? NULL:pold->next);
pnew =  (pold == NULL? NULL:pold->next);
}

return ph;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐