单链表的面试题:
1删除一个无头单链表的非尾节点
2在无头单链表的一个非头节点前插入一个节点
3查找单链表的中间节点,要求只能遍历一次链表
4查找单链表的倒数第k个节点,要求只能遍历一次链表
5从尾到头打印单链表
6逆置 / 反转单链表
存储结构:
typedef int DataType;
typedef struct SListNode
{
DataType _data;
struct SListNode* _next;
}SListNode;
单链表的 增 删 查 在此省略
//替换法 pos —— pos->_next //快慢指针 fast slow //递归
删除一个无头单链表的非尾节点
1 --》 2 --》 3 --》 4 --》 5--》 NULL
pos del next
void DelNoTailNode(SListNode* pos) //替换法
{
assert(pos);
assert(pos->_next);
SListNode* del = pos->_next ;
SListNode* next = del->_next;
pos->_data = del->_data;
pos->_next = del->_next;
free(del);
}
2.在无头单链表的一个非头节点前插入一个节点
1 --》 2 --》 3 --》 5--》 NULL
pos next
tmp 4
1)void InsertFrontNode(SListNode* pos,DataType x)
{
assert(pos);
SListNode* tmp = _BuyNode(x);
tmp->_next = pos->_next;
pos->_next = tmp;
DataType tmpData = pos->_data;
pos->_data =tmp->_data;
tmp->_data = tmpData;
}
2)void InsertFrontNode(SListNode* pos,DataType x)
{
assert(pos);
SListNode* tmp = _BuyNode(pos->_data);
tmp->_next = pos->_next;
pos->_next = tmp;
pos->_data = x;
}
3.查找单链表的中间节点,要求只能遍历一次链表
fast一次走两步,slow一次走一步,直至fast至NULL
SListNode* FindMidNode(SListNode* pHead) //快慢指针
{
SListNode* fast = pHead;
SListNode* slow = pHead;
while (fast&&fast->_next)
{
fast = fast->_next->_next;
slow = slow->_next;
}
return slow;
}
//进一步思考
//struct Ret{ SListNode* first;SListNode* second; };
//奇数返回一个,偶数返回两个
4.查找单链表的倒数第k个节点,要求只能遍历一次链表
fast走k步,slow再走,至fast==NULL
SListNode* FindKNode(SListNode* pHead, DataType K) //快慢指针
{
SListNode* fast = pHead;
SListNode* slow = pHead;
while (fast&&K--)
{
fast = fast->_next;
}
if (K > -1) return NULL;
//if (fast == NULL) return NULL;
while (fast)
{
fast = fast->_next;
slow = slow->_next;
}
return slow;
}
5.从尾到头打印单链表
void PrintTailToHead(SListNode* pHead) //递归
{
if (pHead)
{
PrintTailToHead(pHead->_next);
printf("%d->", pHead->_data);
}
}
6.逆置 / 反转单链表
1 --》 2 --》 3 --》 4 --》 NULL
tmp,cur
取节点tmp newHead
... --》 1 --》 NULL
SListNode* Reverse(SListNode* pHead) //取节点头插
{
SListNode* cur = pHead;
//取节点,并置NULL
SListNode* newHead = NULL;
//头插
while (cur)
{
SListNode* tmp = cur;
cur = cur->_next;
tmp->_next = newHead;
newHead = tmp;
}
return newHead;
}
转载于:https://blog.51cto.com/1536262434/1754122