精华内容
下载资源
问答
  • 题目 题目:假设有一个双向链表,链表中每个节点定义如下: public class Node { ...// 交换节点位置(注意:我们不知道a节点和b节点的位置以及先后顺序) void changeNode(Node a, Node b) { Node aBe

    题目

    题目:假设有一个双向链表,链表中每个节点定义如下:

    public class Node {
        public Node Before;
        public Node After;
        public int Content;
    }
    

    请写出一段逻辑,将已知的两个节点(A节点、B节点)在链表中的位置互换下

    转换前:
    在这里插入图片描述

    转换后:
    在这里插入图片描述

    代码

    // 交换节点位置(注意:我们不知道a节点和b节点的位置以及先后顺序)
    void changeNode(Node a, Node b) {
        Node aBefore = a.Before; // a节点的上一个节点
        Node aAfter = a.After; // a节点的下一个节点
        Node bBefore = b.Before; // b节点的上一个节点
        Node bAfter = b.After; // b节点的下一个节点
        // 通过判断a节点来决定b节点应该怎么做,用来搞定b节点
        if (aBefore == null) {
            // a节点是头结点
            b.Before = null;
            b.After = aAfter;
            aAfter.Before = b;
        } else if (aAfter == null) {
            // a节点是尾节点
            b.Before = aBefore;
            b.After = null;
            aBefore.After = b;
        } else {
            // a节点是中间节点
            b.Before = aBefore;
            b.After = aAfter;
            aBefore.After = b;
            aAfter.Before = b;
        }
        // 通过判断b节点来决定a节点应该怎么做,用来搞定a节点
        if (bBefore == null) {
            // b节点是头结点
            a.Before = null;
            a.After = bAfter;
            bAfter.Before = a;
        } else if (bAfter == null) {
            // b节点是尾结点
            a.Before = bBefore;
            a.After = null;
            bBefore.After = a;
        } else {
            // b节点是中间节点
            a.Before = bBefore;
            a.After = bAfter;
            bBefore.After = a;
            bAfter.Before = a;
        }
    }
    
    展开全文
  • C/C++ code#define TRUE 1;#define FALSE 0;//定义Employeetypedef struct{int id;char name[30];int age;double wage;}Employee;//定义Employee链表结点结构typedef struct ...//双向链表struct node* precede;st...

    C/C++ code#define TRUE 1;

    #define FALSE 0;

    //定义Employee

    typedef struct

    {

    int id;

    char name[30];

    int age;

    double wage;

    }Employee;

    //定义Employee链表结点结构

    typedef struct node

    {

    Employee* emp;

    //双向链表

    struct node* precede;

    struct node* next;

    }EmpNode;

    //定义Employee链表

    typedef struct

    {

    //链表头结点

    EmpNode* head;

    //当前长度

    int length;

    }EmpList;

    //选择排序,对输入的链表的结点的Employee排序,排序以wage为依据

    int sort(EmpList* empList)

    {

    int i;

    int j;

    //currentNode是记录外层循环的当前结点

    EmpNode* currentNode;

    //tempNode是记录内层循环的游标作用的结点

    EmpNode* tempNode;

    //maxNode是记录最高工资的结点

    EmpNode* maxNode;

    //依次用每一个数据与其它数据比较,遍历一次排好一个数

    for(i = 1; i < empList->length; i++)

    {

    //初始化游标结点和maxNode为当前结点

    tempNode = currentNode->next;

    maxNode = currentNode;

    //从当前结点向后遍历

    for(j = i; j < empList->length; j++)

    {

    //如果游标指示的结点对应的工资比当前工资高,更新maxNode

    if(tempNode->emp->wage > currentNode->emp->wage)

    {

    maxNode = tempNode;

    }

    //比较一次后,currentNode向后移动

    tempNode = tempNode->next;

    }

    //一趟遍历完成后,选出的最大结点与当前结点位置交换

    swap(currentNode, maxNode);

    //交换完成后让当前结点后移一位

    currentNode = currentNode->next;

    }

    return TRUE;

    }

    //交换链表中的两个结点的位置

    int swap(EmpNode* node1, EmpNode* node2)

    {

    //交换前先记录下node1的前后结点

    EmpNode* preNode = node1->precede;

    EmpNode* nextNode = node1->next;

    //使node1处于node2的位置

    node1->precede = node2->precede;

    node1->next = node2->next;

    node2->precede->next = node1;

    if(NULL != (node2->next))

    {

    node2->next->precede = node1;

    }

    //使node2处于原来node1的位置

    node2->precede = preNode;

    node2->next = nextNode;

    preNode->next = node2;

    if(NULL != (nextNode))

    {

    nextNode->precede = node2;

    }

    return TRUE;

    }

    展开全文
  • 反转链表

    2021-03-18 10:54:33
    剑指offer 24 双向链表 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 示例: ...每交换位置。 pre指针用来存储下一个节点。 cur | | pre null → 1 → 2 → 3 → 4

    反转链表Ⅰ 剑指offer 24

    定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

    示例:

    输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL

    来源:力扣(LeetCode) 著作权归领扣网络所有。

    1. 双指针Ⅰ

    每两位交换位置。
    pre指针用来存储下一个节点。

    cur | | pre
    null → 1 → 2 → 3 → 4 → 5 → null

    null ← 1 2 → 3 → 4 → 5 → null

    var reverseList = function(head) {
        let cur = null;
        let pre = head;
        while(pre!=null){
            let tmp = pre.next;  //临时存储pre.next,以便后续pre指针右移
            pre.next = cur;      //cur节点与pre节点反指
            cur = pre;  		 //pre和cur指针右移
            pre = tmp;
        }
        return cur;
    };
    

    反转链表Ⅱ leetcode92

    给你单链表的头节点 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置
    right 的链表节点,返回 反转后的链表 。

    示例 1:

    输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5]

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/reverse-linked-list-ii

    //反转链表Ⅰ
    const reverseList =(head) =>{
        let cur = null;
        let pre = head;
         while(pre!=null){
             let tmp = pre.next;
             pre.next = cur;
             cur = pre;
             pre = tmp;
           }
        };
    
    var reverseBetween = function(head, left, right) {
    //dummyNode 规避head分情况讨论
        let dummyNode = new ListNode(-1);
        dummyNode.next = head;
        let pre = dummyNode;	//left节点前面的一个节点
        let suc;				//right后面一个节点
        let leftNode, rightNode;
        
        //寻找left节点和pre节点
        for(let i = 0;i<left-1;i++){
            pre = pre.next;
        }
        leftNode = pre.next;
        
    	//从pre节点开始向后,寻找right节点和suc节点
        rightNode = pre;
        for(let i = 0;i<right-left+1;i++){
            rightNode = rightNode.next;
        }
        suc = rightNode.next;
    	//切割子链表
        rightNode.next = null;
        pre.next = null;
        //旋转链表Ⅰ
        reverseList(leftNode);
    	//接回去
        pre.next = rightNode;
        leftNode.next = suc;
    
        return dummyNode.next;
    };
    
    展开全文
  • //异或交换两节点的值 p_tail=p_head^p_tail; p_head=p_head^p_tail;*/ } int move(int map[20][20],int* p_x,int* p_y,int* p_ax,int* p_ay,node* p_head,node* p_tail) { switch(dir){ case 'a': if(map...
  • 数据结构与算法.xmind

    2020-06-19 17:04:23
    双向链表 一个节点个指针域 自由主题 循环链表 能通过任何一个节点找到其他所有的节点,将种(双向/单向)链表的最后一个结点指向第一个结点从而实现循环 常见操作 添加数据到...
  • 面试题27:二叉搜索树与双向链表:按照左右子树分治,递归实现。根的左边连接左子树的最右边结点,右边连接右子树的最左边结点。 面试题28:字符串的排列:依次取一个元素,然后依次和之前递归形成的所有子串组合,...
  • 范例1-49 删除双向链表中的节点 121 ∷相关函数:ListDelete函数 1.3.19 双向链表的元素个数 124 范例1-50 双向链表的元素个数 124 ∷相关函数:ListLength函数 1.3.20 判断双向链表是否为空 126 范例1-51 ...
  • C 开发金典

    2013-06-20 16:20:03
    范例1-49 删除双向链表中的节点 121 ∷相关函数:ListDelete函数 1.3.19 双向链表的元素个数 124 范例1-50 双向链表的元素个数 124 ∷相关函数:ListLength函数 1.3.20 判断双向链表是否为空 126 范例1-51 ...
  • C语言通用范例开发金典.part2.rar

    热门讨论 2012-08-31 14:18:18
    范例1-49 删除双向链表中的节点 121 ∷相关函数:ListDelete函数 1.3.19 双向链表的元素个数 124 范例1-50 双向链表的元素个数 124 ∷相关函数:ListLength函数 1.3.20 判断双向链表是否为空 126 范例1-51 ...
  • 范例1-49 删除双向链表中的节点 121 ∷相关函数:ListDelete函数 1.3.19 双向链表的元素个数 124 范例1-50 双向链表的元素个数 124 ∷相关函数:ListLength函数 1.3.20 判断双向链表是否为空 126 范例1-51 ...
  • Linux内核源码+电子书

    热门讨论 2011-02-21 15:13:10
    电子书+源码 ...2.2 双向循环链表的操作 2.3 基本C库函数 2.4 Linux内存管理中Slab缓冲区 2.5 Linux中的VFS 2.6 Linux的连网 2.7 网络设备支持 2.8 模块支持 2.9 硬件接口 2.10 块设备 2.11 USB 设备
  • 2.2 双向循环链表的操作 2.3 基本C库函数 2.4 Linux内存管理中Slab缓冲区 2.5 Linux中的VFS 2.6 Linux的连网 2.7 网络设备支持 2.8 模块支持 2.9 硬件接口 2.10 块设备 2.11 USB 设备 2 参考文献
  • c语言经典案例

    2014-10-30 08:06:57
    实例182 使用指针交换两个数组 中的最大值 257 实例183 输出二维数组有关值 259 实例184 输出二维数组任一行 任一列值 260 实例185 将若干字符串按照字母 顺序输出 262 实例186 用指向函数的指针比较大小 263 实例...
  • 实例005 获得鼠标在窗体上的位置 实例006 记录鼠标行为 实例007 通过截取系统消息判断鼠标的单击键 1.2 鼠标基本设置 实例008 定义鼠标指针形状 实例009 自定义鼠标的图片 实例010 自定义动画鼠标 实例011 交换鼠标...
  • 实例005 获得鼠标在窗体上的位置 实例006 记录鼠标行为 实例007 通过截取系统消息判断鼠标的单击键 1.2 鼠标基本设置 实例008 定义鼠标指针形状 实例009 自定义鼠标的图片 实例010 自定义动画鼠标 实例011 交换鼠标...
  • 实例005 获得鼠标在窗体上的位置 实例006 记录鼠标行为 实例007 通过截取系统消息判断鼠标的单击键 1.2 鼠标基本设置 实例008 定义鼠标指针形状 实例009 自定义鼠标的图片 实例010 自定义动画鼠标 实例011 交换鼠标...
  • 了解了Lambda表达式的使用,我们再来看看函数式接口:ava 8增加了个新的概念在接口声明的时候: 默认方法和静态方法。 7.2 默认方法允许我们在接口里添加新的方法,而不会破坏实现这个接口的已有类的兼容性,也...
  • 实例062 在ListBox控件间交换数据 77 实例063 将数据库数据添加到ListBox控件中 78 实例064 借助绑定控件实现数据选择录入 79 实例065 设置ListBox控件选择项 80 2.5 选择类控件应用 83 实例066 利用选择控件实现...
  • C#程序开发范例宝典(第2版).part02

    热门讨论 2012-11-12 07:55:11
    实例062 在ListBox控件间交换数据 77 实例063 将数据库数据添加到ListBox控件中 78 实例064 借助绑定控件实现数据选择录入 79 实例065 设置ListBox控件选择项 80 2.5 选择类控件应用 83 实例066 利用选择控件...
  • C#程序开发范例宝典(第2版).part13

    热门讨论 2012-11-12 20:17:14
    实例062 在ListBox控件间交换数据 77 实例063 将数据库数据添加到ListBox控件中 78 实例064 借助绑定控件实现数据选择录入 79 实例065 设置ListBox控件选择项 80 2.5 选择类控件应用 83 实例066 利用选择控件...
  • 实例062 在ListBox控件间交换数据 77 实例063 将数据库数据添加到ListBox控件中 78 实例064 借助绑定控件实现数据选择录入 79 实例065 设置ListBox控件选择项 80 2.5 选择类控件应用 83 实例066 利用选择控件...
  • 实例062 在ListBox控件间交换数据 77 实例063 将数据库数据添加到ListBox控件中 78 实例064 借助绑定控件实现数据选择录入 79 实例065 设置ListBox控件选择项 80 2.5 选择类控件应用 83 实例066 利用选择控件...
  • 实例062 在ListBox控件间交换数据 77 实例063 将数据库数据添加到ListBox控件中 78 实例064 借助绑定控件实现数据选择录入 79 实例065 设置ListBox控件选择项 80 2.5 选择类控件应用 83 实例066 利用选择控件...
  • 实例062 在ListBox控件间交换数据 77 实例063 将数据库数据添加到ListBox控件中 78 实例064 借助绑定控件实现数据选择录入 79 实例065 设置ListBox控件选择项 80 2.5 选择类控件应用 83 实例066 利用选择控件...
  • 实例062 在ListBox控件间交换数据 77 实例063 将数据库数据添加到ListBox控件中 78 实例064 借助绑定控件实现数据选择录入 79 实例065 设置ListBox控件选择项 80 2.5 选择类控件应用 83 实例066 利用选择控件...
  • 实例062 在ListBox控件间交换数据 77 实例063 将数据库数据添加到ListBox控件中 78 实例064 借助绑定控件实现数据选择录入 79 实例065 设置ListBox控件选择项 80 2.5 选择类控件应用 83 实例066 利用选择控件...
  • 实例062 在ListBox控件间交换数据 77 实例063 将数据库数据添加到ListBox控件中 78 实例064 借助绑定控件实现数据选择录入 79 实例065 设置ListBox控件选择项 80 2.5 选择类控件应用 83 实例066 利用选择控件...
  • 实例062 在ListBox控件间交换数据 77 实例063 将数据库数据添加到ListBox控件中 78 实例064 借助绑定控件实现数据选择录入 79 实例065 设置ListBox控件选择项 80 2.5 选择类控件应用 83 实例066 利用选择控件...
  • 实例062 在ListBox控件间交换数据 77 实例063 将数据库数据添加到ListBox控件中 78 实例064 借助绑定控件实现数据选择录入 79 实例065 设置ListBox控件选择项 80 2.5 选择类控件应用 83 实例066 利用选择控件...
  • 实例062 在ListBox控件间交换数据 77 实例063 将数据库数据添加到ListBox控件中 78 实例064 借助绑定控件实现数据选择录入 79 实例065 设置ListBox控件选择项 80 2.5 选择类控件应用 83 实例066 利用选择控件...

空空如也

空空如也

1 2 3
收藏数 42
精华内容 16
关键字:

双向链表交换两节点位置