单链表之删除某一位置节点

单链表删除某一位置节点的程序十分容易,但也容易出错。网上流传的一些程序并不正确。

这一程序的关键点在于:删除某一位置节点,那么需首先确定其前驱结点。前驱节点存在一些特例情况:当前节点为空、当前非空但后继为空(尾节点)。

同时,还要进行断言以及待删节点为首节点的相关处理。完整程序如下:

#include "stdafx.h"
#include <stdlib.h>
#include <assert.h>

typedef struct Node
{
	int data;
	Node* next;
}LinkList;

//删除第i个节点
LinkList* Delete(LinkList* head,int i)
{
	assert(head!=NULL);//判断链表是否为空
	LinkList* p=head;
	int j=1;
	if(j==i)//删除头结点
	{
		return head->next;
	}
	while(p&&j<i-1)//寻找第i个节点的前驱,退出循环存在三种情况:1) p=NULL,j<i-1;2)p!=NULL,j=i-1,p->next=NULL;3)p!=NULL,j=i-1,p->next!=NULL;
	{
		p=p->next;
		++j;
	}
	if(p==NULL||p->next==NULL)//前两种情况均需排除,只有第三种情况满足题意
	{
		printf("Position Error");
		return NULL;
	}
	LinkList* q=p->next;
	p->next=q->next;
	delete q;
	q=NULL;
	return head;
}

int _tmain(int argc, _TCHAR* argv[])
{
	LinkList* head=new LinkList;
	head->data=1;head->next=NULL;
	LinkList* subHead=head;
	for(int i=2;i<=10;i++)
	{
		LinkList* temp=new LinkList;
		temp->data=i;temp->next=NULL;
		subHead->next=temp;
		subHead=temp;
	}
	//head=Delete(head,1);
	head=Delete(head,10);
	while(head!=NULL)
	{
		printf("%d   ",head->data);
		head=head->next;
	}
	system("pause");
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 12:29:29

单链表之删除某一位置节点的相关文章

在单链表中删除指定值的节点

问题描述: 给定一个链表的头结点head和一个整数num,请实现函数将值为num的节点全部删除. 例如:链表为1->2->3->5->3->6->null,num=3,调整后的链表为: 1->2->5->6->null 算法实现: public class Node { public int value; public Node next; public Node(int value) { this.value = value; }} 算法1:

从无头单链表中删除节点

1.从无头单链表中删除节点 一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(不是第一个也不是最后一个节点).将该节点删除. A-->B-->C-->D       =====>     A-->C-->D 问题解析:由于只能单向遍历,故与删除B节点,无法得知B的前驱A,即无法像普通删除中那样让A的next指向C; 这里有个技巧,将C当做B,而B复制成C,则删除C节点即可: 2.给定一个链表的头指针,要求只遍历一次,将单链表中的元素顺序反转过来. A-->

编程之美:从无头单链表中删除节点,讨论

1.问题描述 假设有一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(不是第一个,也不是最后一个),请将该节点从单链表中删除. 如下图所示: 这种情况大家都知道,将下一个节点的data和next拷贝到当前节点,并将当前节点的next设置为下下个节点,然后释放下一个节点所占内存(free), 如果红字条件去掉: 还用上面的方法就有问题,一般上面方法的代码如下: void DeleteRandomNode(Node* pCurrent) { if(pCurrent == NULL) ret

栈和队列----删除无序单链表中值重复出现的节点

删除无序单链表中值重复出现的节点 给定一个无序单链表的头节点head,删除其中值重复的节点 例如: 1->2->3->3->4->4->2->1->1->null 删除之后变为 1->2->3->4->null 方法1:如果链表长度为N,时间复杂度达到O(N) 方法2:如果要求空间复杂度为O(1),应该怎样实现 [解析] 方法1:利用哈希表去实现 使用哈希表,因为头节点是不用删除的节点,所以首先将头节点放入到哈希表中,然后从下一

【LeetCode-面试算法经典-Java实现】【019-Remove Nth Node From End of List(移除单链表的倒数第N个节点)】

[019-Remove Nth Node From End of List(移除单链表的倒数第N个节点)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a linked list, remove the nth node from the end of list and return its head. For example, Given linked list: 1->2->3->4->5, and n = 2. After remo

【LeetCode-面试算法经典-Java实现】【083-Remove Duplicates from Sorted List(排序的单链表中删除重复的结点)】

[083-Remove Duplicates from Sorted List(排序的单链表中删除重复的结点)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Given a sorted linked list, delete all duplicates such that each element appear only once. For example, Given 1->1->2, return 1->2. Given 1->1->2

单链表的删除

单链表的删除,就是找到链表节点的前面一个节点,将其与待删节点的下一个节点连接,待删节点断链 function remove(head,val){ var pre = head; while(pre.next && pre.next.val != val){ pre = pre.next; } if(pre == null){ return; } if(pre.next != null){ pre.next = pre.next.next; } } 另一种删除方法,已知链表的头节点和待删节点

习题11-8 单链表结点删除 (20分)

习题11-8 单链表结点删除 (20分) 本题要求实现两个函数,分别将读入的数据存储为单链表.将链表中所有存储了某给定值的结点删除.链表结点定义如下: struct ListNode { int data; ListNode *next; }; 函数接口定义: struct ListNode *readlist(); struct ListNode *deletem( struct ListNode *L, int m ); 函数readlist从标准输入读入一系列正整数,按照读入顺序建立单链表

C语言:【单链表】删除一个无头单链表的非尾节点

#include<stdio.h> #include<assert.h> #include<stdlib.h> typedef int DataType; typedef struct SListNode {     DataType data;     struct SListNode* next;  }SListNode; SListNode* BuyNode( DataType x) {     SListNode* next = (SListNode*)mall