反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
思路:
定义三个指针,next,cur,next分别指向:链表第一个节点,链表第二个节点,链表第三个节点。每次判断cur是否为NULL,通过next往后遍历,直到cur为空,这时pre指向最后一个元素,返回pre,同时让链表头指向NULL。
如下图:
代码:
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode *nodePre,*nodeCur,*nodeNext;
//第一个节点
nodePre = (struct ListNode*)malloc(sizeof(struct ListNode) * 1);
//中间节点
nodeCur = (struct ListNode*)malloc(sizeof(struct ListNode) * 1);
//第三个节点
nodeNext = (struct ListNode*)malloc(sizeof(struct ListNode) * 1);
//如果链表为空或者链表只有两个元素就直接返回头结点
if(head == NULL || head->next == NULL)
return head;
//将第一、二、三个节点分别指向链表中第一、二、三个节点
nodePre = head;
nodeCur = head->next;
nodeNext = nodeCur->next;
//如果当前节点不为空
while(nodeCur)
{
//将当前节点的下一个节点指向前节点
nodeCur->next = nodePre;
//使三个节点依次后移
nodePre = nodeCur;
nodeCur = nodeNext;
if(nodeNext)
nodeNext = nodeNext->next;
}
//将头节点的下一个节点指向空,同时使头节点指向
head->next = NULL;
//此时pre是最后一个节点,也是反转后的第一个节点
head = nodePre;
return head;
}