链表
链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它可以根据需要开辟内存单元。链表有一个“头指针”变量,以head表示,它存放一个地址。该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址。因此,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”)。链表主要分为3大类:单项链表,双向链表,循环链表,下面以单向链表为例。单向链表的操作包括创建、删除、 插入(无序、有序)、输出、 排序(选择、插入、冒泡)、反序等等。
一.设计数据结构
//单链表
typedef struct node
{
int data; //数据
struct node *pNext;
}Node,*pLinkedList;
1.创建链表
pLinkedList CreateNode(int data)
{
Node *pNode = (Node *)malloc(sizeof(Node));
if(pNode)
{
pNode->data = data;
pNode->pNext = NULL;
}
return pNode;
}
定义一个打印链表的函数
void Print( Node *head)
{
Node *p;
p = head;
if(head != NULL)
{
while (p != NULL)
{
printf ("%p %d \n", p, p->data);
p =(Node*)p->pNext; //移到下一个节点
}
}
}
//创建有5个节点的单链表
pLinkedList CreateNodesExample()
{
pLinkedList headNode = CreateNode(0);
pLinkedList pTemp = headNode;
for (int i = 1; i<5; i++)
{
pTemp->pNext = CreateNode(i);
pTemp = pTemp->pNext;
}
return headNode;
}
调用下面的代码
pLinkedList pHead = CreateNodesExample();
Print(pHead);printf("\n");
日志如下:
0x100301380 0
0x100301390 1
0x1003013a0 2
0x100303220 3
0x100303230 4
2.反转链表
//反转链表
pLinkedList Reverse (pLinkedList pHead)
{
Node *pTemp; //临时存储
Node *pResult; //存储返回结果
Node *pCurrent; //源节点一个一个取
pResult = NULL; //开始颠倒时,已颠倒的部分为空
pCurrent = pHead; //pCurrent指向链表的头节点
while(pCurrent != NULL)
{
pTemp = pCurrent->pNext;
pCurrent->pNext =pResult;
pResult = pCurrent;
pCurrent = pTemp;
}
pHead = pResult;
return pHead;
}
调用
pHead = Reverse(pHead);
Print(pHead);printf("\n");
日志:
0x100303230 4
0x100303220 3
0x1003013a0 2
0x100301390 1
0x100301380 0
OC下可以用NSArray NSDictonary代替,如果自己实现,代码如下
@interface LinkedList : NSObject
@property (nonatomic,strong) NSNumber *number;
@property (nonatomic,strong) LinkedList *nextNode;
@end
//反转
- (LinkedList *)reserverLinkedLink:(LinkedList *)node
{
LinkedList *tempNode; //临时存储
LinkedList *currentNode; //当前节点
LinkedList *resultNode; //转换后的新链表
resultNode = nil;
currentNode = node;
while (currentNode) {
tempNode = currentNode.nextNode;
currentNode.nextNode = resultNode;
resultNode = currentNode;
currentNode = tempNode;
}
return resultNode;
}