#include<iostream> using namespace std; void printList(ListNode *head) { ListNode *p=head; while(p != NULL) { cout << p->num << endl; p = p->next; } } int printList(ListNode *head) { ListNode *p=head; int k = 0; while(p)//指导谁操作谁时,是p { k++; p = p->next; } return k; } ListNode *Locate(ListNode *head, int num) { ListNode *p = head; while(p) { if(p->num == num) break; p = p->next; } return p; } ListNode *createByTail() { ListNode *head = NULL; ListNode *p1, *p2; int n = 0, num; while(cin >> num) { if(!num) break; p1 = new ListNode;//合并了操作 p1->num = num; n = n+1; if(n == 1) head = p1; else p2->next = p1; p2 = p1;//合并了操作 } while(head) //表里面要有东西才能这么写 p2->next = NULL; return head; } ListNode *insertNode(ListNode *head, ListNode *p, ListNode *s) { ListNode *q; if(p == head) { s->next = head; head = s; } else { q = head; while(q->next != p) q = q->next; s->next = p; q->next = s; } return head; } ListNode *insertNodeInOrder(ListNode *head, ListNode *s) { ListNode *p1, *p2; if(head == NULL) { s->next = NULL; head = s; } else { p1 = head; while((s->num > p1->num) && (p1->next != NULL)) { p2 = p1; p1 = p1->next; } if(s->num <= p1->num) { if(head == p1) head = s; else p2->next = s; s->next = p1; } else { p1->next = s; s->next = NULL; } } } ListNode *insertNodeInOrder(ListNode *head, ListNode *s) { ListNode *p1, *p2; if(head == NULL) { head = s; s->next = NULL; } else { } } ListNode *deleteNude(ListNode *head, int num) { ListNode *p1, *p2; if(head == NULL) { cout << "NULL list"; return head; } p1 = head; while(num != p1->num && p1->next != NULL) { p2 = p1; p1 = p1->next; } if(num == p1->num) { if(p1 == head) head = p1->next; else p2->next = p1->next; } else cout <<"Not found"<<end; return head; } int main() { } Code

#include<iostream> using namespace std; struct ListNode { int num; ListNode *next; }; ListNode *createByTail() { ListNode *head, *p1, *p2; head = new ListNode; head->p = NULL; p2 = head; int num; while(cin >> num) { p1 = new ListNode; p1->num = num; p2->next = p1; p2 = p1; } p2->next = NULL; return head; } void InsertNode(ListNode *head, ListNode *p, ListNode *s) { ListNode *q; q = head; while(q->next && q->next != p)//只用q->next就可以访问完所有的结点,太美妙了!!!! q = q->next; if(q->next == p) { q->next = s; s->next = p; } else cout <<"invaled"<<endl; return head; } void DeleteNode(ListNode *head, ListNode *p)//直接按照p判断的不需要判断是否为空列表 { ListNode *q; q = head; while(q->next && q->next != p) q = q->next; if(q->next = p) { q->next = p->next; delete p; } } void DeleteNode(ListNode *head, int num)//需要琢磨 //直接按照num判断的需要判断是否为空列表 { ListNode *p1, *p2; if(head->next == NULL)//访问前必须判断一下有无 { cout <<"NULL list"; return ; } p2 = head; p1 = head->next; while(num != p1->num && p1->next != NULL)//p1已经是最后一个元素了,连最后一个元素都不是,那就找不到了 { p2 = p1; p1 = p1->next; } if(num == p1->num) { p2->next = p1->next; delete p1; } else cout <<"not found!"<<endl; } void ReverseList(ListNode *head)//需要琢磨 { ListNode *p, *s; p = head->next; head->next = NULL; while(p)//p==NULL,说明s是最后一个元素,那么把最后一个元素上上去了就行了 { s = p; p = p->next; s->next = head->next; head->next = s; } } int main() { }

void InsertNode(ListNode *head, ListNode *p, ListNode *s) { ListNode *q2, q1; q2 = head; while(q2->next)//q2是前一个结点,q1才是正确的结点 { //访问当前点 q1 = q2->next; if(q1就是要找的点) break; //进入到下一阶段 q2 = q2->next; } if(q2->next)//没找完就退出了,肯定是找到了 { //还是要把当前的点找到 q1 = q2->next; q2->next = q1->next; delete q1; } else cout <<"invaled"<<endl; return head; }
注:单次操作时不要循环里面操作,因为有可能没找到啥的,要到最后来判断找到了没
但是,删除操作是特殊的,如果在的访问的过程中就删除,那么如果删除了就不p2=p2->next,因为以访问每一个节点为目的,删除过后自动更新了当前结点
这种更新方式(在线删除)要和单个删除(非实时)分开

ListNode *mergeList(ListNode *ha, ListNode *hb) { ListNode *pa2, *pa1, *pb2, *pb1, *s; pa2 = ha; while(pa2->next) { int flag = 0; pa1 = pa2->next; //cout << (pa1->id)<<"next:"<<(pa1->next->id)<<endl; pb2 = hb; while(pb2->next) { pb1 = pb2->next; if(pb1->id == pa1->id) { flag = 1; break; } pb2 = pb2->next; } if(!flag) { pa2->next = pa1->next; delete pa1; } else pa2 = pa2->next;//这里加个else就是因为删除了结点就不需要手动更新结点了 } return ha; }
链表的数量大小是内存决定的(数组大了会崩溃)
ListNode **表示的是指针的指针,(例如&head)
写链表用Microsoft visual c++调试比较好
链表还是要考虑空链表,头,中间,尾部