一、逆置/反转单链表
逆置一个单链表和从尾到头打印不一样,打印不改变节点的位置,只是将数据反着打印一遍,而逆置就是要改变节点的位置。
可以先创建一个空节点,然后从第一个开始每次在单链表上拿一个节点,前插给创建的节点,单链表的头结点往后移,创建的新节点往前移。当单链表为空的时候,也就逆置完了。
这里面我们需要三个指针分别是cur,用来顺序遍历整个链表,nextNode指针用来保存逆置的头结点,pre用来逆序遍历链表.
步骤:
1:先遍历整个链表找到当前节点的下一个节点为空,即为尾节点也是逆置后的头结点
2:pre用来保存当前节点的上一个节点.
3:然后更新节点的位置,把当前节点指针指向前一个节点,再把它的下一个指针指向当前位置,这样就可以保证所有节点链在一起了.
1)、节点的结构:
#define NULL 0
typedef int DataType;
typedef struct Node
{
DataType _data;
struct Node* _pNext;
}Node,*PNode;
2)、逆置链表
PNode ReverseList(PNode pHead)
{
//1.单链表为空或只有一个节点,直接返回
//2.链表有多个节点
PNode curNode = pHead; //curNode -> 找到当前结点的下一个节点为空
PNode preNode = NULL; //preNode -> 保存当前结点的上一个结点
PNode nextNode = NULL;
while (curNode != NULL)
{
PNode _next = curNode->_pNext;
if ( NULL == _next)
nextNode = curNode; //nextNode -> 逆置后的头结点
curNode->_pNext = preNode;
preNode = curNode; //更新当前结点的位置
curNode = _next;
}
return nextNode;
}
链表逆置结果:
二、查找单链表的倒数第k个节点,要求只能遍历一次链表
typedef int DataType;
typedef struct Node
{
DataType _data;
struct Node* _pNext;
}Node,*PNode;
//4.查找单链表的倒数第k个节点,要求只能遍历一次链表
PNode FindLastKNode(PNode pHead, size_t k)
{
//1.链表为空
//2.链表元素少于K
//3.链表元素多余K
PNode pfast = pHead;
PNode pslow = pHead;
if (NULL == pHead || k < 0)
return NULL;
while (k--)
{
pfast = pfast->_pNext; //pfast指向K的下一个节点
}
while (pfast)
{
pfast = pfast->_pNext; //pfast -> null
pslow = pslow->_pNext; //pslow -> 倒数第k个节点
}
return pslow; //指针pslow指向倒数第K个结点
}
//2.【附加题】--实现一个Add函数,让两个数相加,但是不能使用+、-、*、/等四则运算符。ps:也不能用++、--等等
int Add(int num1, int num2)
{
int temp;
while (temp = (num1&num2))
{
num1 = num1^num2;
num2 = (temp<<1);
}
return (num1^num2);
}