以前实现过链表的简单函数,详细见http://blog.youkuaiyun.com/dove1202ly/article/details/77168657
今天我们来看看链表涉及的面试题相信大家都知道单链表面试题的重要性,既然知道,我们就应该把思路捋清楚,然后多敲几遍多敲几遍多敲几遍(重要的事情说三遍),在我身边好多编程好的把这几个函数敲了不下十遍,而我太菜,这才是第一次下定决心把这个整理出来,如果有不对的地方,请多多指正,谢谢(^U^)ノ~YO
首先定义一个节点结构体:
typedef int DataType;
typedef struct ListNode
{
DataType data;
struct ListNode* next;
} ListNode;
1.链表的逆序打印(递归实现)
思路分析:
实现代码:
void Reverse(ListNode* plist)
{
if (plist == NULL)
{
return;
}
else if (plist != NULL)
{
Reverse(plist->next);
printf("%d-->", plist->data);
}
}
测试代码:
void Test1()// Reverse
{
ListNode* list = NULL;
PushFront(&list, 1);
PushFront(&list, 2);
PushFront(&list, 3);
PushFront(&list, 4);
Display(list);
Reverse(list);
Destroy(&list);
}
2、删除无头链表的非尾节点
思路分析:
实现代码:
void RemoveNotHead(ListNode** ppList, DataType x)//删除无头链表的非尾节点
{
ListNode* del = NULL;
ListNode* cur = Find(*ppList, x);
assert(ppList);
if (cur == NULL)
{
return;
}
del = cur->next;
cur->data = del->data;
cur->next = del->next;
free(del);
}
测试代码:
void Test2()//RemoveNotHead
{
ListNode* list = NULL;
PushFront(&list, 1);
PushFront(&list, 2);
PushFront(&list, 3);
PushFront(&list, 4);
Display(list);
RemoveNotHead(&list, 3);
Display(list);
Destroy(&list);
}
3、在无头单链表的一个节点前插入一个节点
思路分析:
实现代码:
void InsertNonFront(ListNode* pos, DataType x)
{
ListNode* cur = pos->next;
ListNode* tmp = BuyNode(x);
DataType _tmp;
assert(pos);
pos->next = tmp;
tmp->next = cur;
_tmp = pos->data;//交换tmp与pos的值
pos->data = tmp-&