题目总览
- 从尾到头打印单链表
- 删除一个无头单链表的非尾节点
- 在无头单链表的一个节点前插入一个节点
- 单链表实现约瑟夫环
- 逆置/反转单链表
- 单链表排序(冒泡排序&快速排序)
- 合并两个有序链表,合并后依然有序
- 查找单链表的中间节点,要求只能遍历一次链表
- 查找单链表的倒数第n个节点,要求只能遍历一次链表
思路及代码
从尾到头打印单链表
递归法,若当前节点不为空,在打印当前节点前打印上一个节点。
void ConversePrint(ListNode* pList)
{
if (pList != NULL)
{
ConversePrint(pList->next);
printf("%d ", pList->data);
}
}
删除一个无头单链表的非尾节点
将当前节点的内容改为下个节点的内容,释放下个节点,让当前节点指向下下个节点。
void popNode(ListNode* pList)
{
if (pList != NULL)
{
ListNode* tmp = pList->next;
pList->data = pList->next->data;
pList->next = pList->next->next;
free(tmp);
}
}
在无头单链表的一个节点前插入一个节点
新建一个节点保存当前节点的内容,并指向下一个节点。
将当前节点改为插入的内容,指向新节点。
void InsertBefore(ListNode* pList, DataType x)
{
assert(pList);
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->data = pList->data;
newNode->next = pList->next;
pList->next = newNode;
pList->data = x;
}
单链表实现约瑟夫环
- 接收一个环形链表的头指针地