3.4 从无头单链表中删除节点

假设一个没有头指针的单链表,只有一个指向中间节点(不是头尾节点)的指针,请将该节点从单链表中删除。

 

思路:假设中间一段链表为 A->B->C,而p指向节点B。因为没有头节点,其实无法追溯回A,然后使A->C。所以这里的技巧是将C中的value值赋给B中,使B成为C,然后删除真正的C,从而达到目的。

 

 1 #include "stdafx.h"
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 const int MID_NUM = 3;
 7 const int MAX_NUM = 8;
 8 
 9 struct node{
10     int value;
11     struct node *next;
12 };
13 
14 node* createMidLinkedList(int midNum,node *headPtr){
15     node *midPtr,*p;
16 
17     for(int i=0;i<MAX_NUM;i++){
18         p = (node *)malloc(sizeof(node));
19         p->value = i;
20         p->next = headPtr->next;
21         headPtr->next = p;
22         if(p->value==midNum)
23             midPtr = p;
24         cout<<p->value<<" -> ";
25     }
26     cout<<endl<<endl;
27     return midPtr;
28 }
29 
30 //delete middle node
31 bool deleteMidNode(node *midPtr){
32     if(midPtr==NULL || midPtr->next==NULL) return false;
33 
34     node *mid,*midNext;
35     mid = midPtr;
36     midNext = mid->next;
37 
38     if(midNext!=NULL){
39         mid->value = midNext->value;
40         mid->next = midNext->next;
41         delete midNext; //
42     }
43     
44 
45     return true;
46 }
47 
48 int _tmain(int argc, _TCHAR* argv[])
49 {
50     node *head= (node *)malloc(sizeof(node));; //不可在createMidLinkedList方法中分配内存
51     head->next = NULL; //一定不可以漏,否则判断head->next==NULL时会返回false!
52     node *mid = createMidLinkedList(MID_NUM,head);
53     if(deleteMidNode(mid)){
54         head = head->next;
55         while(head!=NULL){
56             cout<<head->value<<" -> ";
57 
58             head = head->next;
59         }
60     }else{
61         cout<<"Failed to delete!"<<endl;
62     }
63 }

 

输出为:

 

可见节点3(MID_NUM)已经被删除。

 

引申问题:只有一个头节点,翻转单链表,要求只遍历一次

利用构造链表时的方法,修改代码如下:

 1 node *reverseLinkedList(node *headPtr){
 2     if(headPtr==NULL) return NULL;
 3 
 4     node *head,*newHead,*p,*temp;
 5     head=headPtr;
 6     p = head->next;
 7     newHead = (node *)malloc(sizeof(node));
 8     newHead->next = NULL;
 9 
10     while(p!=NULL){
11         temp = p->next;
12         p->next    = newHead->next;
13         newHead->next = p;
14         p = temp;
15     }
16 
17     return newHead;
18 }
19 
20 int _tmain(int argc, _TCHAR* argv[])
21 {
22     node *head= (node *)malloc(sizeof(node));; //不可在createMidLinkedList方法中分配内存
23     head->next = NULL; //一定不可以漏,否则判断head->next==NULL时会返回false!
24     node *mid = createMidLinkedList(MID_NUM,head);
25     node *hPtr; //new header pointer
26     if(deleteMidNode(mid)){
27         hPtr = head;
28 
29         //print list
30         head = head->next;
31         while(head!=NULL){
32             cout<<head->value<<" -> ";
33             head = head->next;
34         }
35         cout<<endl<<endl;
36 
37         head = reverseLinkedList(hPtr);
38 
39         //print list
40         head = head->next;
41         while(head!=NULL){
42             cout<<head->value<<" -> ";
43             head = head->next;
44         }
45 
46     }else{
47         cout<<"Failed to delete!"<<endl;
48     }
49 }

 

 

可见输出如下:

posted @ 2012-09-20 13:22  macemers  阅读(502)  评论(0编辑  收藏  举报