删除链表节点

#include <stdio.h>
//有头结点的情况
typedef struct Node{  
    int data;  
    struct Node* next;  
};   
//尾插   
void create(struct Node* head){  
    //p是工作指针   
    struct Node* p = head;  
    int i;  
    for(i = 1; i<=1; i++){  
      
        p->next = malloc(sizeof(struct Node));  
        p->next->value = i;  
        p->next->next = null;  
        p = p->next;           
          
    }     
}  
  
void print(struct Node* head){  
    struct Node* p = head->next;  
    while(p){  
        printf("%d\t",p->value);  
        p = p->next;  
    }  
    printf("\n");  
      
}  


//时间复杂度O(n)
int deleteNode(Node *head,Node *x){
struct Node *p = head->next;
struct Node *pre = head;
while(p) {
if(p->data==x->data) {
pre->next = p->next;
free(p);
return 1;
}else {
pre = p;
}
p = p->next;
}
return 0;
}
//倒置
void rev(Node *head) {
f(head->next!=null) {
struct Node *p = head->next->next;
struct Node *pre = head->next;
struct Node *temp;
pre->next = null;
while(p) {
temp = p;
p = p->next;
    temp->next = pre;
pre = temp;
}
head->next = pre;
}
}



//没头结点的情况 
struct Node{  
    int value;  
    struct Node* next;  
};  
  
//头插   
struct Node* create(){  
    struct Node* head = null;  
    int i;  
    for(i = 1; i<=10; i++){  
        if(head == null){  
            head = malloc(sizeof(struct Node));  
            head->value = i;  
            head->next = null;     
        }else{  
            struct Node* p = malloc(sizeof(struct Node));     
            p->value = i;  
            p->next  = head->next;                  
            head->next = p;  
        }  
    }  
    return head;      
}  
  
void print(struct Node* head){  
    struct Node* p = head;  
    while(p){  
        printf("%d\t",p->value);  
        p = p->next;  
    }  
    printf("\n");  
      
}  
//这里注意想要改变head的指向,必须传head的引用,所以是Node**
int deleteNode(Node *x Node **head){
struct Node *p =  head 
struct Node *pre =  head;
struct Node *temp;
//删除第一个节点需要特殊处理
if((*head)-data==x->data){
(*head) = (*head)->next;
free(head);
return 1;
}
//不是第一个节点
while(p) {
if(p->data==x->data) {
pre->next = p->next;
free(p);
return 1;
}else {
pre = p;
}
p = p->next;
}
return 0;
}


//时间复杂度为O(1).删除节点。
int deleteNode(Node *x,Node *head) {
struct Node *p = x ;
//删除不是尾节点
if(p->next!=null) {
p = x->next;
x->data = p->data;
x->next = p->next;
free(p);
return 1;
}else {
//删除的是尾节点
p = head;
while (p->next->data!=x->data){
p = p->next;
}
p->next = null;
free(x);
return 1;
}
return 0;
}
</pre><pre code_snippet_id="648132" snippet_file_name="blog_20150420_3_6675778" name="code" class="java">
<pre name="code" class="java"><pre name="code" class="java">void deleteNode(int data,Node *head) {
<span style="white-space:pre">	</span>Node *p = head;
 <span style="white-space:pre">	</span>while(p!=null) {
<span style="white-space:pre">		</span>//删除不是尾节点
<span style="white-space:pre">		</span>if(p->data==data && p->next!=null) {
                <span style="white-space:pre">	</span>Node *x = p->next;
<span style="white-space:pre">			</span>p->data = x->data;<span style="white-space:pre">	</span>
<span style="white-space:pre">			</span>p->next = x->next;
<span style="white-space:pre">		</span>}else{
<span style="white-space:pre">		</span>//删除尾节点
<span style="white-space:pre">		</span>delete p;
<span style="white-space:pre">		</span>p = null;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>p = p->next;
<span style="white-space:pre">	</span>}
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值