Problem:

Given a linked list, swap every two adjacent nodes and return its head.

For example,
Given 1->2->3->4, you should return the list as 2->1->4->3.

Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed.

本题要我们通过节点的操作来两两置换,而不是通过修改val的值。这题主要就是考察对链表指来指去,最后指向哪里是否清楚。应该要这样考虑,对于 1 2 3 4,先设置一个头指向这个表,假设为0,则0指向1,现在我们想要的结果是0指向2指向1指向3指向4.一步一步来,先将2的next赋值给1的next,然后把1赋值给2的next,这样就有了 2指向1指向3.(如果先把1直接赋值给2的next,那么这是3就被1覆盖了,找不到3了,所以不能这样做)。我们已经有了2指向1指向3指向4,因为0指向的还是1,没改,所以这个时候要将0指向2了,那么就有了0指向2指向1指向3指向4,还没有结束,因为3和4还没有置换。同理,这个时候要先把4的next给3,再把3给4的next。这时候是不是就完了呢,不是的,因为1指向的还是3,所以还需要将4给1的next(这个通过代码中的bef(就是before的意思)来实现,每次把bef赋值为已经置换好的第二个,再把下一个置换好的头赋值给bef的next,就把整个串好了。因为我们的头是0,所以最后返回0的next指针才是答案。

代码如下:

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *swapPairs(ListNode *head)
{
if(!head || !(head -> next))
{
return head;
}
ListNode *tmp = new ListNode();
ListNode *ans = tmp;
ListNode *bef = ans; // 用来保证将ans指向下一个二元组
tmp -> next = head;
tmp = tmp -> next;
while(tmp && (tmp -> next))
{
ListNode *m = tmp;
ListNode *nn = tmp -> next;
tmp = tmp -> next;
m -> next = nn -> next;// 例如 1 2 3,先把1指向3,再把2指向1,这样的话就是2 -> 1 -> 3
tmp -> next =m;
bef -> next = tmp; // bef的下一个要指向下一个二元组的第一个
tmp = m -> next;
bef = m;// 更新bef为转换好的二元组的后一个,为了使得和下一个二元组连接
}
return ans -> next; // ans 的第一个为零,next开始才是所要的
}
};

我在return上面加一个delete ans,居然还是accept。这题规模小所以new的不delete可以。如果我想要delete呢。应该如何?

最新文章

  1. mfc 控件字体设置
  2. 集合与Iterator
  3. 转:CentOS设置时区
  4. RS485模块(485与TTL信号的转换)
  5. TGL 月光精品教程整理
  6. Python读取文件内容的三种方式并比较
  7. 导出kettle数据转换设置
  8. perl oracle utf-8 结果匹配中文字符
  9. GLFW3出error adding symbols: DSO missing from command line解决
  10. linux 通过pid寻找程序路径的最简单命令
  11. 【Python中if __name__ == '__main__': 的解析】
  12. NLP —— 图模型(一)隐马尔可夫模型(Hidden Markov model,HMM)
  13. The packages can be overrided by Java Endorsed Standards
  14. quartz任务调度框架与spring整合
  15. Java利用cors实现跨域请求
  16. Centos 7.6搭建LAMP,部署zabbix监控环境
  17. "贪吃蛇"-css3效果
  18. ER/数据库建模工具之MySQL Workbench的使用
  19. CentOS 7 MariaDB-MMM
  20. 机器学习--Logistic回归

热门文章

  1. 一张漫画说尽IT开发过程
  2. css3 3d旋转动画
  3. poj 2482 Stars in Your Window(扫描线)
  4. Android清除缓存功能来实现
  5. NET MVC
  6. LinbDesk --- 新的extjs4.2 desktop demo : 技术交流Q群:336584192
  7. git merge简介(转)
  8. iphone手机版降级
  9. EasyUI 扩展自己定义EasyUI校验规则 验证规则(经常使用的)
  10. 4.事务提交过程,交易的基本概念,Oracle交易周期,保存点savepoint,数据库的隔离级别