[链表常用技巧]链表逆序+链表中点

链表逆序

给定一个链表,一般的逆序的方法要设置三个指针,这种操作很繁琐,下面总结一种简单的方法:

为链表设置一个头结点,然后head后面的节点依次的插入到head结点之前。最后完成链表的逆序。

代码实现:

ListNode* reverseList(ListNode* head)
    {
        if(head == NULL)
            return NULL;

        ListNode dummy(-1);
        dummy.next = head;
        ListNode *pre = dummy.next;

        while(pre->next != NULL)
        {
            ListNode *tmp = pre->next;
            pre->next = tmp->next;
            tmp->next = dummy.next;
            dummy.next = tmp;
        }//while

        return dummy.next;
    }

再来看一个链表的中点

查找链表的中点,使用的方法就是快慢指针。但是要注意结点总数为奇数个或者结点总数为偶数个的时候,中点结点指针停止的位置不同。

代码实现:

ListNode *fast = head;
ListNode *low = head;

//利用快慢指针找到链表的中点
while(fast != NULL && fast->next != NULL)
{
	fast = fast->next->next;
	low = low->next;
}
//注意链表结点的个数奇数还是偶数
//偶数结点个数,low指向后半部分的第一个
//奇数结点个数,low指向越过对称中心结点,指向后半部分的第一个结点
if(fast != NULL)
{
	low = low->next;
}

  

时间: 2024-08-07 05:53:32

[链表常用技巧]链表逆序+链表中点的相关文章

leetcode——Reverse Linked List II 选择链表中部分节点逆序(AC)

Reverse a linked list from position m to n. Do it in-place and in one-pass. For example: Given 1->2->3->4->5->NULL, m = 2 and n = 4, return 1->4->3->2->5->NULL. Note: Given m, n satisfy the following condition: 1 ≤ m ≤ n ≤ le

C语言实现单链表的遍历,逆序,插入,删除

单链表的遍历,逆序,插入,删除 #include<stdio.h> #include<stdlib.h> #include <string.h> #define bzero(a, b) memset(a, 0, b)//windows平台下无bzero函数. 增加宏拓展移植性 struct node { int data; //有效数据 struct node *pNext;//指向下一个节点的指针 }; struct node * make_node(int data

剑指Offer14 逆序链表

1 /************************************************************************* 2 > File Name: 14_ReverseListNode.cpp 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年08月30日 星期二 15时47分32秒 6 *********************************

单链表 - 神一般的逆序

在这篇文章 Linked List 中学习了如何写出单链表的基本操作. 现在来写一个程序进行单链表的逆序操作: void Reversal( List L ) { Position pReversal; Position P,Pnext; P = L->Next; pReversal->Next = NULL; while( P != NULL ) { Pnext = P->Next; P->Next = pReversal->Next; pReversal->Next

华为机试—逆序链表输出

题目描述:   将输入的一个单向链表,逆序后输出链表中的值.链表定义如下: typedef struct tagListNode { int value; struct tagListNode *next; }ListNode; 要求实现函数:   void converse(ListNode **head); [输入]head:    链表头节点,空间已经开辟好 [输出]head:    逆序后的链表头节点 [返回]无 [注意]只需要完成该函数功能算法,中间不需要有任何IO 的输入输出 #in

链表的创建及逆序打印

1.链表的创建,以下: void AddToTail(Link ** head,int value) { Link * p = new Link(); Link * ahead = *head; p->value = value; p->next = NULL; if(*head == NULL) *head = ahead = p; else { while(ahead->next) { ahead=ahead->next; } ahead->next = p; } } 以

逆序链表

当时见别人实现的代码太长, 自己写了一个. 半年之后, 蓦然回首, 自己居然看不懂了.. 实现 1 Node *ReverseList(Node *pRoot) 2 { 3 Node *pEnd = pRoot, *pBeg = pRoot; 4 if (pRoot) 5 { 6 while (pEnd->pNext) 7 { 8 Node *pNode = pEnd->pNext; 9 pEnd->pNext = pNode->pNext; 10 11 pNode->pNe

C++ 递归和非递归实现链表逆序

测试环境:vs2010  windows7 逆序分别采用递归调用和链表头插法实现逆序. 具体代码如下: #include<iostream> #include<stdlib.h> using namespace std; class LinkList { private: struct Node { struct Node *next; int value; }; Node *phead; void reverse_use_recursion(Node *pnode) { if(p

[2013] 链表逆序

题目二:逆序链表输出. 题目描述:   将输入的一个单向链表,逆序后输出链表中的值.链表定义如下: typedef struct tagListNode  {        int value;        struct tagListNode *next;  }ListNode;   要求实现函数:   void converse(ListNode **head); [输入]head:    链表头节点,空间已经开辟好 [输出]head:    逆序后的链表头节点 [返回]无 [注意]只需要