链表是linux内核的一个基本数据结构,针对该结构以宏定义形式定义了一些操作接口,包括添加、删除、合并,搞不懂的是这个合并函数,
static inline void list_splice(struct list_head *list, struct list_head *head); |
“假设当前有两个链表,表头分别是list1和list2(都是struct list_head变量),当调用list_splice(&list1,&list2)时,只要list1非空,list1链表的内容将被挂接在list2链表上,位于list2和list2.next(原list2表的第一个节点)之间。新list2链表将以原list1表的第一个节点为首节点,而尾节点不变。如图(虚箭头为next指针):”

图 链表合并list_splice(&list1,&list2)
按照linux内核中的代码:
static inline void __list_splice(struct list_head *list,
struct list_head *head)
{
struct list_head *first = list->next;
struct list_head *last = list->prev;
struct list_head *at = head->next;
first->prev = head;
head->next = first;
last->next = at;
at->prev = last;
}
上图list1就是函数中的list,list2就是函数中的head,这个图示和函数我始终搞不明白,哪个高手帮忙解释一下?