链表是最基本的数据结构,也是面试中较为常见的问题,链表的一些基本操作功能是必须能够实现,下面是一些关于链表基本的操作。
——链表的节点设置
typedef int Datatype; typedef struct SListNode { Datatype data; //数据域 struct SListNode *next; //next指针域 }SListNode;
——链表的基本操作
(1)删除一个无头单链表的非尾节点
(2)在无头单链表的一个非头结点前插入一个节点
(3)查找单链表的中间节点,要求只能遍历一次链表
(4)查找单链表的倒数第k个节点,要求只能遍历一次单链表
(5)从尾到头打印单链表(使用递归,压入堆栈)
(6)逆置单链表,不能创建节点
//利用头插法建立单链表 void Frontinsert(SListNode *&phead) { SListNode *tmp = (SListNode *)malloc(sizeof(SListNode)); } //删除一个无头单链表的非尾节点 void DelNonTailNode(SListNode *pos) { assert(pos); assert(pos->next); //非尾节点 SListNode *del = pos->next; pos->data = del->data; pos->next = del->next; free(del); } //在无头单链表的一个非头结点前插入一个节点 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; } //查找单链表的中间节点,要求只能遍历一次链表 SListNode * FindMidNode(SListNode * phead) { SListNode *fast = phead; SListNode *slow = phead; while (fast) { if (fast->next != NULL) { fast = fast->next->next; } else { break; } slow = slow->next; } return slow; } //查找单链表的倒数第k个节点,要求只能遍历一次单链表 SListNode * FindKNode(SListNode *phead, Datatype k) { SListNode *fast = phead; SListNode *slow = phead; while (fast && k--) { fast = fast->next; } if (fast == NULL) { return NULL; } while (fast) { fast = fast->next; slow = slow->next; } return slow; } //从尾到头打印单链表(使用递归,压入堆栈) void printTailToHead(SListNode *phead) { if (phead == NULL) { return; } else { printTailToHead(phead->next); printf("%d ", phead->next); } } //逆置单链表,不能创建节点 SListNode *Reverse(SListNode *phead) { SListNode *cur = phead; SListNode *newhead = NULL; while (cur) { SListNode *tmp = cur; cur = cur->next; tmp->next = newhead; } return phead; }