头结点通常是指链表中第一个节点,它不存储任何数据。头结点用来方便处理链表操作,比如插入、删除、遍历等。头结点通常使用一个指针来表示,这个指针指向链表第一个节点的位置。在大部分编程语言中,可以使用一个类或结构体来表示链表的节点,比如:
```python
class Node:
def __init__(self, data=None, next=None):
self.data = data
self.next = next
head = Node() # 头结点
```
在上述代码中,使用 `head = Node()` 创建了一个头结点,并将其赋值给 `head` 变量。头结点的 `data` 属性通常为空,`next` 属性指向链表的第一个节点。
数据结构中,在单链表的第一个结点之前附设一个结点,它没有直接前驱,称之为头结点。下面以顺序存储为例来叙述。
(1) 头插法建表
该方法从一个空表开始,读取数组a中的字符,生成新结点,将读取的数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头上,直到结束为止。算法如下:
void CreateListF(Snode *&L, ElemType a[], int n)
{ Snode *s; int i;
L = (Snode *) malloc(sizeof(Snode));
L->next = NULL;
for (i=0; i<n;i++)/*改成for (i=n; i>1;i--)可让节点次序与原数组元素顺序相同。
{ s = (Snode *)malloc(sizeof(Snode));
s->data = a[i];
s->next = L->next;
L->next = s;
}
}
(2) 尾插法建表
头插法建立链表虽然算法简单,但生成的链表中结点的次序和原数组元素的顺序相反,若希望两者次序一致,可采用尾插法。该方法是将新结点插到当前链表的表尾上,为此必须增加一个尾指针r,使其始终指向当前链表的尾结点。算法如下:
void CreateListR(Snode *&L, ElemType a[], int n)
{ Snode *s, *r; int i;
L = (Snode *) malloc(sizeof(Snode));
L->next = NULL;
r = L;
for (i=0; i<n;i++)
{ s = (Snode *)malloc(sizeof(Snode));
s->data = a[i];
r->next = s;
r = s;
}
r-> next = NULL;
}