1.7交换链表中的相邻节点

交换链表中的相邻节点

题目描述:

把链表相邻元素翻转,例如给定链表为1——>2一>3一>4一>5——>6一>7,则翻转后的链表变为2一>1一>4一>3一>6一>5一>7

解题思路:

就地逆序法:

通过调整结点指针域的指向来直接调换相邻的两个结点。如果单链表恰好有偶数个结点,那么只需要将奇偶结点对调即可,如果链表有奇数个结点,那么只需要将除最后一个结点外的其它结点进行奇偶对调即可。

代码实现:

# -*-coding:utf-8-*-
"""
@Author  : 图南
@Software: PyCharm
@Time    : 2019/9/6 18:34
"""
class Node:
    def __init__(self, data=None, next=None):
        self.data = data
        self.next = next

def print_link(head):
    if head is None or head.next is None:
        return None
    cur = head.next
    while cur.next != None:
        print(cur.data, end=' ')
        cur = cur.next
    print(cur.data)

def con_link(n):
    head = Node()
    cur = head
    for i in range(1, n+1):
        node = Node(i)
        cur.next = node
        cur = node
    return head

def reverseNode(head):
    pre = head
    cur = pre.next
    while cur is not None and cur.next is not None:
        next = cur.next
        pre.next = next
        cur.next = next.next
        next.next = cur
        pre = cur
        cur = pre.next
    return head

if __name__ == '__main__':
    head = con_link(6)
    print_link(head)
    head = reverseNode(head)
    print_link(head)

运行结果:


原文地址:https://www.cnblogs.com/miao-study/p/11479801.html

时间: 2024-09-30 10:09:32

1.7交换链表中的相邻节点的相关文章

交换链表中的相邻结点

leetcode地址: https://leetcode.com/problems/swap-nodes-in-pairs/description/ 这题查看不难,但是实际上难度是中等,这题的难度在于边界条件比较难处理,初始情况不太好办 这里我使用一个虚拟的头结点来处理初始情况,这样初始情况就变得统一了,也就是有了虚拟头结点,在代码中我们就不需要再对初始情况做特殊处理,而且对于链表长度只有1或2的特殊情况也巧妙第覆盖到了. 代码: public class SwapPairs { public

24 交换链表中相连的节点

ListNode *swapPairs(ListNode *head) { if (head == nullptr || head->next == nullptr) return head; ListNode *it = head; head = head->next; it->next = head->next; head->next = it; while (it->next != nullptr && it->next->next !

lintcode:交换链表当中两个节点

题目 给你一个链表以及两个权值v1和v2,交换链表中权值为v1和v2的这两个节点.保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做. 注意事项 你需要交换两个节点而不是改变节点的权值 样例 给出链表 1->2->3->4->null ,以及 v1 = 2 , v2 = 4返回结果 1->4->3->2->null. 解题 交换值的方式 /** * Definition for singly-linked list. * public cla

[华为机试练习题]24.删除链表中的反复节点、剩余节点逆序输出

题目 描写叙述: 题目描写叙述: 输入一个不带头节点的单向链表(链表的节点数小于100),删除链表中内容反复的节点(反复的节点所有删除),剩余的节点逆序倒排. 要求实现函数: void vChanProcess(strNode * pstrIn,strNode * pstrOut); [输入] pstrIn:输入一个不带头节点的单向链表 [输出] pstrOut:删除内容反复的节点(反复的节点所有删除).剩余节点逆序输出(不带头节点,链表第一个节点的内存已经申请). [注意]仅仅须要完毕该函数功

83. 移除已排序链表中重复的节点 Remove Duplicates from Sorted List

Given a sorted linked list, delete all duplicates such that each element appear only once. For example,Given 1->1->2, return 1->2.Given 1->1->2->3->3, return 1->2->3. 移除单链表中重复的节点 public class Solution { public ListNode DeleteDup

[华为机试练习题]24.删除链表中的重复节点、剩余节点逆序输出

题目 描述: 题目描述: 输入一个不带头节点的单向链表(链表的节点数小于100),删除链表中内容重复的节点(重复的节点全部删除),剩余的节点逆序倒排. 要求实现函数: void vChanProcess(strNode * pstrIn,strNode * pstrOut); [输入] pstrIn:输入一个不带头节点的单向链表 [输出] pstrOut:删除内容重复的节点(重复的节点全部删除),剩余节点逆序输出(不带头节点,链表第一个节点的内存已经申请). [注意]只需要完成该函数功能算法,中

[华为机试练习题]49.向升序单向链表中插入一个节点

题目 描述: 输入一个升序单向链表和一个链表节点,向单向链表中按升序插入这个节点. 输入为空指针的情况视为异常,另外不考虑节点值相等的情况. 链表结点定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 详细描述: 接口说明 原型: ListNode* InsertNodeToList(ListNode* pListHead, ListNode* pInsertNode); 输入参数: ListNode* pListHead 单向链表

刷题--删除链表中重复的节点

题目描述: 在一个排序的链表中,存在重复的节点,请删除该链表中重复的节点,重复的节点不保留,返回链表头指针.例如,,链表1->2->3->3->4->4->5 处理后为 1->2->5 [解1]使用HashMap记录每个节点是否重复出现,时间复杂度为O(N),空间复杂度为O(N) 1 import java.util.*; 2 3 /* 4 public class ListNode { 5 int val; 6 ListNode next = null;

【剑指Offer】删除链表中重复的节点

题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 A:当遍历到第一个值为重复的节点时,要有一个指针指向它的前一个节点    因为函数原型没有传二级指针进来,且头结点也有可能被删除,所以要构建一个新结点Head 用布尔型的flag_repeat判断是否有重复节点,若有重复节点则删除,若没有重复节点则移动指针 /* struct Li