随笔分类 -  链表

摘要:删除结点的操作我们经常碰到,比如一个链表A->B->C->D->E->F->G。如果我们要删除结点E,那么我们只需要让结点D的指针指向结点F即可,但是我们现在只给出链表头结点的指针以及结点E的指针,而又是单项链表,不能在O(1)时间内得到被删除结点前面的那一个结点的指针,所以我们原先的方法是不能在O(1)时间内删除结点E的。那么既然我们不能获得被删除结点的前一个结点的指针,我们就需要转变思路来考虑是否能够用过被删除结点后一个结点的指针来解决方法。因此被删除结点E的后一个结点指针是很容易得到的,也就是E->m_pNext。那么我们可能会想到如下方法:获得 阅读全文
posted @ 2012-11-12 15:16 byfei 阅读(1159) 评论(0) 推荐(0) 编辑
摘要:题目:输入一个链表,输出该链表中倒数第K个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。看到这道题目,最直观的想法,就是先算出链表的长度n,然后倒数第k个结点就是顺序的第(n-k+1)个数,不过这样需要2次遍历链表,如果要求只能遍历链表一次,那么上述算法就不符合要求了。那我们就使用第二种算法,设定两个指针p1和p2,两个指针刚开始都指向链表的第一个结点,然后让p1指针先走(k-1)步,然后再让两个指针一起往后走,当p1指针指向链表最后一个结点的时候 阅读全文
posted @ 2012-11-12 15:03 byfei 阅读(459) 评论(0) 推荐(1) 编辑
摘要:Node * MergeRecursive(Node *head1 , Node *head2){if ( head1 == NULL )return head2 ;if ( head2 == NULL)return head1 ;Node *head = NULL ;if ( head1->data < head2->data ){head = head1 ;head->next = MergeRecursive(head1->next,head2);}else{head = head2 ;head->next = MergeRecursive(head1 阅读全文
posted @ 2012-06-27 19:02 byfei 阅读(801) 评论(0) 推荐(0) 编辑
摘要:Node * Merge(Node *head1 , Node *head2){if ( head1 == NULL)return head2 ;if ( head2 == NULL)return head1 ;Node *head = NULL ;Node *p1 = NULL;Node *p2 = NULL;if ( head1->data < head2->data ){head = head1 ;p1 = head1->next;p2 = head2 ;}else{head = head2 ;p2 = head2->next ;p1 = head1 ;}N 阅读全文
posted @ 2012-06-27 18:59 byfei 阅读(485) 评论(0) 推荐(0) 编辑
摘要:#include <iostream>using namespace std;struct Node{ int nData; Node * pNext;};Node *CreateList(Node* pHead){ Node * pTemp; for(int i = 1;i<10;i++) { pTemp = new Node(); pTemp->nData = i; pTemp->pNext = pHead; pHead = pTemp; } return pHead;}Node *ReverseList(Node* pHead){ Node* p1 = pH 阅读全文
posted @ 2012-06-27 18:55 byfei 阅读(138) 评论(0) 推荐(0) 编辑